Python 如何检测从QStandardItem中的setCheckable(True)创建的复选框是否已选中?
我有一个QStandardItem,setCheckable等于True 无论何时检查或取消检查此QStandardItem,我都需要能够执行代码 我该怎么做Python 如何检测从QStandardItem中的setCheckable(True)创建的复选框是否已选中?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我有一个QStandardItem,setCheckable等于True 无论何时检查或取消检查此QStandardItem,我都需要能够执行代码 我该怎么做 这需要在任何时候发生,因此请不要使用checkState之类的回答,因为需要在单击该框后立即进行检查。您可以将itemChanged信号连接到一个函数,以处理对该项的任何更改,并在该函数中检查其状态。这要求您的项目存储在模型中,docs一个可能的初始解决方案是使用itemChanged信号,如下所示: 导入系统 从PyQt5导入QtCor
这需要在任何时候发生,因此请不要使用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在下的不可撤销的权利,以分发该内容,即无论您未来的选择如何。根据堆栈交换策略,帖子的非破坏版本是分发的版本。因此,任何故意破坏行为都将恢复原状。如果您想了解有关删除帖子的更多信息,请参阅: