如何在pyqt中获取QTableView第一列的复选框

How to get checkbox in first column of QTableView in pyqt

在我的 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

现在不了解 PyQT,但认为与 c++Qt 没有区别。 您需要为可检查列 Qt::ItemIsUserCheckable.

覆盖 Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex & index) const 和 return

刚遇到这个问题。不确定你是否找到了答案。 要回答你的问题,如果你只想要第一列的复选框,你将需要 return QtCore.Qt.UncheckedQtCore.Qt.Checked 仅用于 indexcolumn == 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

并且,您可以检查 index 是否在 self.__listData 和 return QtCore.Qt.UncheckedQtCore.Qt.Checked 中。