PyQt QAbstractListModel似乎忽略了三态标志

2024-09-29 00:20:18 发布

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

我已经尝试了几天来弄清楚为什么我的QAbstractLisModel不允许用户在三种状态下切换可检查项。模型在flags()方法中返回Qt.IsTristateQt.ItemIsUserCheckable,但仅当程序运行时Qt.已检查以及Qt.未检查在编辑时切换。在

class cboxModel(QtCore.QAbstractListModel):
    def __init__(self, parent=None):
        super(cboxModel, self).__init__(parent)
        self.cboxes = [
            ['a',0],
            ['b',1],
            ['c',2],
            ['d',0]
        ]

    def rowCount(self,index=QtCore.QModelIndex()):
        return len(self.cboxes)

    def data(self,index,role):
        if not index.isValid: return QtCore.QVariant()
        myname,mystate = self.cboxes[index.row()]
        if role == QtCore.Qt.DisplayRole:
            return QtCore.QVariant(myname)
        if role == QtCore.Qt.CheckStateRole:
            if mystate == 0:
                return QtCore.QVariant(QtCore.Qt.Unchecked)
            elif mystate == 1:
                return QtCore.QVariant(QtCore.Qt.PartiallyChecked)
            elif mystate == 2:
                return QtCore.QVariant(QtCore.Qt.Checked)
        return QtCore.QVariant()

    def setData(self,index,value,role=QtCore.Qt.EditRole):
        if index.isValid():
            self.cboxes[index.row()][1] = value.toInt()[0]            
            self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),
                      index, index)
            print self.cboxes
            return True
        return False

    def flags(self,index):
        if not index.isValid():
            return QtCore.Qt.ItemIsEditable
        return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable |     QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsTristate

你可以用这个来测试

^{pr2}$

并确保只有2个州可用。我想我缺少一些简单的东西。有什么想法吗?谢谢!在


Tags: selfindexreturnifdefqtroleflags
2条回答

您可能需要在clicked()信号上创建一个自定义槽,该槽在三个状态之间循环。通常,三态元素只能直接点击打开和关闭,并且只有在子元素处于不同状态时才处于部分选中模式。在

相关问题 更多 >