PyQt QAbstractListModel似乎忽略了三态标志

1 投票
2 回答
1611 浏览
提问于 2025-04-15 21:37

我这几天一直在琢磨,为什么我的 QAbstractListModel 不能让用户在三种状态之间切换可选项。模型在 flags() 方法中返回了 Qt.IsTristateQt.ItemIsUserCheckable,但是当程序运行时,编辑时只会在 Qt.Checked 和 Qt.Unchecked 之间切换。

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

你可以用这个来测试一下,

class MainForm(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        model = cboxModel(self)

        self.view = QtGui.QListView()
        self.view.setModel(model)

        self.setCentralWidget(self.view)


app = QtGui.QApplication(sys.argv)
form = MainForm()
form.show()
app.exec_()

你会发现只有两种状态可用。我觉得我可能漏掉了什么简单的东西。有什么想法吗?谢谢!

2 个回答

0

看起来这是一个大家都知道的问题,可以在这里查看:

108755 - Qt::ItemIsTristate 在模型视图中无法将复选框设置为三态

0

你可能需要为点击信号创建一个自定义的槽,这个槽可以在三种状态之间循环切换。一般来说,三态元素只能直接被点击开启或关闭,只有当子元素处于不同状态时,它们才会显示为部分选中状态。

撰写回答