1

在我的 QTableView 中,我试图拥有第一列复选框,但我得到的所有行列都填充有复选框,并且默认情况下所有这些列都被选中。我也无法更改复选框的状态。

class MyTableModel(QtCore.QAbstractTableModel):
    def __init__(self, listData=[[]], headers=[], parent=None):
        super(MyTableModel, self).__init__(parent)

        self.__listData = listData
        self.__headers = headers


    def data(self, index, role):
        row = index.row()
        column = index.column()
        value = self.__listData[row][column]

        if role == QtCore.Qt.CheckStateRole:
            if self.__listData[row] == 0:
                return QtCore.QVariant(QtCore.Qt.Unchecked)
            else:
                return QtCore.QVariant(QtCore.Qt.Checked)
        if role == QtCore.Qt.EditRole:
            return value
        if role == QtCore.Qt.DisplayRole:
            return value
4

2 回答 2

1

现在不要谈论 PyQT,但认为与 c++Qt 没有区别。您需要覆盖Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex & index) const并返回您的可检查列Qt::ItemIsUserCheckable

于 2015-09-11T12:01:50.353 回答
0

刚碰到这个问题。不确定您是否找到了答案。要回答您的问题,如果您只想要第一列的复选框,则需要 returnQtCore.Qt.UncheckedQtCore.Qt.Checked仅 for indexwith column == 0。因此,您可以将代码更改为:

def data(self, index, role):
    row = index.row()
    column = index.column()
    value = self.__listData[row][column]

    if role == QtCore.Qt.CheckStateRole and column == 0:
        if self.__listData[row] == 0:
            return QtCore.QVariant(QtCore.Qt.Unchecked)
        else:
            return QtCore.QVariant(QtCore.Qt.Checked)
    if role == QtCore.Qt.EditRole:
        return value
    if role == QtCore.Qt.DisplayRole:
        return value

并且,您可以检查是否indexself.__listData并返回QtCore.Qt.UncheckedQtCore.Qt.Checked相应地返回。

于 2015-11-24T09:07:02.163 回答