无法从发出信号QtGui.QStandardItem

2024-09-28 18:52:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图重写QTreeView来处理如果复选框被修改的话调整父项和子项。但是我不能发出信号,我也不确定这是否是因为我正在尝试子类QtGui而不是{}。在

以下是将触发错误的代码:

class QStandardItem(QtGui.QStandardItem):
    someSignal = QtCore.Signal()
    def __init__(self, *args, **kwargs):
        QtGui.QStandardItem.__init__(self, *args, **kwargs)
        self.someSignal.emit()

>>> QStandardItem()
# AttributeError: 'PySide2.QtCore.Signal' object has no attribute 'emit' # 

以下是我目前的代码,仅供参考:

^{pr2}$

Tags: 代码selfsignalinitargskwargs复选框emit
2条回答

不是100%确定,但对于Python,为了定义自己的信号,必须使用:

QtCore.pyqtSignal()

此外,您可能还需要inherintQtCore.QObject以使用信号

编辑:刚刚看到你在使用pyside,所以放弃了第一个解决方案,但是在QObject中插入是你的解决方案

正如您所指出的,只有继承自QObject的类才能发出信号,QStandardItem不是{},因此会产生这个问题。适当的选择是使用QStandardItemModel,为此,我们重写setData()方法并建立一个逻辑来验证状态是否已更改,然后使用itemFromIndex()方法发出QStandardItem,该方法返回一个给定的QModelIndex。在

示例:

from PySide2 import QtCore, QtGui, QtWidgets


class StandardItemModel(QtGui.QStandardItemModel):
    checkStateChanged = QtCore.Signal(QtGui.QStandardItem)

    def setData(self, index, value, role=QtCore.Qt.EditRole):
        if role == QtCore.Qt.CheckStateRole:
            last_value = self.data(index, role)
        val = super(StandardItemModel, self).setData(index, value, role)
        if role == QtCore.Qt.CheckStateRole and val:
            current_value = self.data(index, role)
            if last_value != current_value:
                it = self.itemFromIndex(index)
                self.checkStateChanged.emit(it)
        return val


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        w = QtWidgets.QTreeView()

        model = StandardItemModel(w)
        w.setModel(model)

        model.checkStateChanged.connect(self.foo_slot)

        for i in range(4):
            top_level = QtGui.QStandardItem("{}".format(i))
            top_level.setCheckable(True)
            model.appendRow(top_level)
            for j in range(5):
                it = QtGui.QStandardItem("{}-{}".format(i, j))
                it.setCheckable(True)
                top_level.appendRow(it)
        w.expandAll()
        self.setCentralWidget(w)

    @QtCore.Slot(QtGui.QStandardItem)
    def foo_slot(self, item):
        print(item.text(), item.checkState())


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

相关问题 更多 >