PyQt QAbstractListModel, кажется, игнорирует тристатные флаги - PullRequest
1 голос
/ 15 апреля 2010

Я пытался пару дней понять, почему моя QAbstractLisModel не позволяет пользователю переключать проверяемый элемент в трех состояниях. Модель возвращает Qt.IsTristate и Qt.ItemIsUserCheckable в методе flags (), но при запуске программы при редактировании переключаются только 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 состояния. Я предполагаю, что есть кое-что простое, что я скучаю. Есть идеи? Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 апреля 2010
0 голосов
/ 17 апреля 2010

Возможно, вам понадобится создать пользовательский слот для сигнала clicked (), который будет циклически проходить через три состояния. Как правило, элементы трех состояний могут быть включены и выключены только напрямую и находятся в частично проверенном режиме, если подэлементы находятся в разных состояниях.

...