Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检测从QStandardItem中的setCheckable(True)创建的复选框是否已选中?_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python 如何检测从QStandardItem中的setCheckable(True)创建的复选框是否已选中?

Python 如何检测从QStandardItem中的setCheckable(True)创建的复选框是否已选中?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我有一个QStandardItem,setCheckable等于True 无论何时检查或取消检查此QStandardItem,我都需要能够执行代码 我该怎么做 这需要在任何时候发生,因此请不要使用checkState之类的回答,因为需要在单击该框后立即进行检查。您可以将itemChanged信号连接到一个函数,以处理对该项的任何更改,并在该函数中检查其状态。这要求您的项目存储在模型中,docs一个可能的初始解决方案是使用itemChanged信号,如下所示: 导入系统 从PyQt5导入QtCor

我有一个QStandardItem,setCheckable等于True

无论何时检查或取消检查此QStandardItem,我都需要能够执行代码

我该怎么做


这需要在任何时候发生,因此请不要使用checkState之类的回答,因为需要在单击该框后立即进行检查。

您可以将itemChanged信号连接到一个函数,以处理对该项的任何更改,并在该函数中检查其状态。这要求您的项目存储在模型中,docs

一个可能的初始解决方案是使用itemChanged信号,如下所示:

导入系统 从PyQt5导入QtCore、QtGui、QtWidgets 类WindowQtWidgets.QMainWindow: 定义初始自我: 超级窗口,自我初始化__ tableview=QtWidgets.QListView self.setCentralWidgettableview self.model=QtGui.QStandardItemModelself tableview.setModelself.model self.model.itemChanged.connectself.on\u itemChanged 对于ABCDEFGHIJKLMNOPQRSTUVXYZ中的字母: it=QtGui.QStandardItemletter it.setCheckableTrue self.model.appendRowit @QtCore.pyqtSlotQStandardItem* _itemChangedself上的def,项目: 如果item.checkState==QtCore.Qt.Checked: 打印检查 其他: 打印未选中 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: app=qtwidts.QApplicationsys.argv 窗口 橱窗秀 sys.exitapp.exec_ 但它有一个缺点:itemChanged在任何更改之前发出,例如在更改项目的文本、颜色等时。因此,如果您只想在复选框的状态更改时执行操作,则可以使用角色保存以前的状态,然后比较信息:

import sys

from PyQt5 import QtCore, QtGui, QtWidgets

LastState = QtCore.Qt.UserRole + 1000


class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()

        tableview = QtWidgets.QListView()
        self.setCentralWidget(tableview)

        self.model = QtGui.QStandardItemModel(self)
        tableview.setModel(self.model)

        self.model.itemChanged.connect(self.on_itemChanged)

        for letter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
            it = QtGui.QStandardItem(letter)
            it.setData(it.checkState(), LastState)
            it.setCheckable(True)
            self.model.appendRow(it)

    @QtCore.pyqtSlot("QStandardItem*")
    def on_itemChanged(self, item):
        last_state = item.data(LastState)
        current_state = item.checkState()

        if last_state != current_state:
            if item.checkState() == QtCore.Qt.Checked:
                print("checked")
            else:
                print("unchecked")

        item.setData(current_state, LastState)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

当我尝试使用self.model.itemChanged运行该行时,无论我是否将此类命令设置为模型或实际的QStandarItem,我都会得到一个AttributeError,表示itemChanged、stateChanged等不存在。我做错了什么?我也不知道@commands做什么。实际上这里似乎发生了很多事情,我不知道发生了什么。@gd197634f21g3f请先按原样尝试我的代码,并通知我它是否适用于您,如果它适用于您的代码,请尝试将其应用于您的代码,如果您的代码中的应用程序有问题,那么您必须提供一个解决方案,否则无法提供帮助you@gd197634f21g3f再次:嗯,正如我指出的,没有MRE,我不可能帮助您。@gd197634f21g3f不,我希望您复制您的代码,因为如果您像这样使用我的代码,您应该不会有问题,我不希望你在评论中复制它,而是将它添加到你的问题中。顺便说一句,不要破坏你的帖子,为别人做更多的工作。通过在Stack Exchange网络上发布,您已授予Stack Exchange在下的不可撤销的权利,以分发该内容,即无论您未来的选择如何。根据堆栈交换策略,帖子的非破坏版本是分发的版本。因此,任何故意破坏行为都将恢复原状。如果您想了解有关删除帖子的更多信息,请参阅: