【问题标题】:PyQt QAbstractTableModel checkbox not checkablePyQt QAbstractTableModel 复选框不可选中
【发布时间】:2018-05-01 22:09:44
【问题描述】:

我将自己的表模型与 QAbstractTableModel 一起使用,其中我的第一个 col 带有复选框(可检查的原因标志 Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled)。我在尝试使用复选框时遇到问题,因为它们在显示的表格中是不可检查的(不能在them 中进行检查或取消检查)。

我做错了什么?我在自己的表模型类中使用这些方法:

def data(self, index, role):

    row = index.row()
    col = index.column()

    if role == Qt.DisplayRole:
        return '{0}'.format(self.tableData[row][col])

    if role == Qt.CheckStateRole: 
        if col == 0:
            return Qt.Unchecked
        else: 
            return None

def setData(self, index, value, role):
    if not index.isValid():
       return False

    if (role == Qt.CheckStateRole):
        if (index.data(Qt.CheckStateRole) == Qt.Checked):
            return True
        else:
            return False
    else:
        return False

【问题讨论】:

    标签: python pyqt pyqt4 qabstracttablemodel qcheckbox


    【解决方案1】:

    你必须为它存储状态,我们需要有一些永久的东西作为参考,为此我们使用QPersistentModelIndex,在这种情况下是一个字典,其中键是QPersistentModelIndex,值是状态QCheckBox.

    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
    
    
    class TableModel(QAbstractTableModel):
        def __init__(self, parent=None):
            super(TableModel, self).__init__(parent)
            self.tableData = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
            self.checks = {}
    
        def columnCount(self, *args):
            return 3
    
        def rowCount(self, *args):
            return 3
    
        def checkState(self, index):
            if index in self.checks.keys():
                return self.checks[index]
            else:
                return Qt.Unchecked
    
        def data(self, index, role=Qt.DisplayRole):
            row = index.row()
            col = index.column()
            if role == Qt.DisplayRole:
                return '{0}'.format(self.tableData[row][col])
            elif role == Qt.CheckStateRole and col == 0:
                return self.checkState(QPersistentModelIndex(index))
            return None
    
        def setData(self, index, value, role=Qt.EditRole):
    
            if not index.isValid():
                return False
            if role == Qt.CheckStateRole:
                self.checks[QPersistentModelIndex(index)] = value
                return True
            return False
    
        def flags(self, index):
            fl = QAbstractTableModel.flags(self, index)
            if index.column() == 0:
                fl |= Qt.ItemIsEditable | Qt.ItemIsUserCheckable
            return fl
    
    
    if __name__ == "__main__":
        import sys
    
        app = QApplication(sys.argv)
        view = QTableView()
        model = TableModel()
        view.setModel(model)
        view.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 感谢您的回复,但我还是有问题。复选框无法通过鼠标或任何其他方式进行检查。刚刚显示,但不可用
    • 我正在使用 PyQt4
    • 非常感谢!现在它似乎适用于不断变化的状态。但奇怪的是,通过鼠标,只有一些复选框与勾选反应。通过使用空格键,每个似乎都立即滴答作响并且工作正常。还是在使用鼠标时设置项目行为?
    • 我检查并找到了代码的关键部分 - 它用于在 QtableView 上设置样式表。我使用self.tableView.setStyleSheet(""" QTableView::item { padding-left: 10px; padding-right: 10px; } QTableView { #gridline-color: black; };""" )
    • 好的,谢谢。我的 PyQt 代码样式表时不时地给我一些奇怪的行为。我有点困惑关于样式的最佳实践是什么,通常在论坛上我发现 CSS 并不总是很好的工作......
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2013-07-18
    • 2015-08-08
    • 1970-01-01
    • 2011-09-10
    • 2018-12-06
    • 2011-07-10
    • 2016-07-16
    相关资源
    最近更新 更多