【问题标题】:QTableView - checkbox is never checkedQTableView - 复选框从未被选中
【发布时间】:2022-11-10 22:59:08
【问题描述】:

我有一个带有自定义模型的QTableView 对象-我希望每行的第一列都带有复选框。在几次 Google/SO 搜索之后,我找到了一种让我显示复选框的方法,但问题是复选框永远不会在 UI 中被选中,即使我强制从模型中检查状态。

表初始化

self.tableview_triggers = self.findChildren(QTableView, "tableview_triggers")[0]
self.datamodel_triggers = TableView_DataModel_Triggers()
self.tableview_triggers.setModel(self.datamodel_triggers)

我的模型(它扩展了QAbstractTableModel

class TableView_DataModel_Triggers(TableView_DataModel):
    _columnNames = ['Id', 'Type', 'Enabled', 'Importance', 'Label']

    def __init__(self, parent = None):
        super(TableView_DataModel_Triggers, self).__init__(parent)
        
    def data(self, index, role):
        if not index.isValid():
            return None

        item = index.internalPointer()
        if role == Qt.ItemDataRole.DisplayRole:
            c = index.column()
            cname = ''
            if c < len(self._columnNames):
                cname = self._columnNames[c]
            else:
                return ''

            if cname == 'Id':
                return item.id
            elif cname == 'Type':
                return item.type
            elif cname == 'Enabled':
                return 'Yes' if item.enabled == 1 else 'No'
            elif cname == 'Label':
                return item.label
            elif cname == 'Importance':
                return item.importance
            else:
                return cname
        elif role == Qt.ItemDataRole.CheckStateRole and index.column() == 0:
            item = index.internalPointer()
            print("Item checked:", item.checked)

            # We force the role
            return Qt.Checked # Force checked state
            return Qt.Checked if item.checked else Qt.Unchecked
        return None

    # Set data to apply new state
    def setData(self, index, value, role=Qt.EditRole):
        if not index.isValid():
            return False
        if role == Qt.CheckStateRole:
            # Set checked state to internal object
            item = index.internalPointer()
            item.checked = value
            self.dataChanged.emit(index, index)
            return True
        return False

    # Apply flags
    def flags(self, index):
        fl = QAbstractTableModel.flags(self, index)
        if index.column() == 0:
            fl |= Qt.ItemIsEditable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsSelectable
        return fl

根据文档,我有:

  • 实现了setData 函数,可以很好地调用CheckStateRole 的正确索引和角色
  • CheckStateRole实现了data函数,这迫使返回Qt.Checked(以确保它返回正确的值)
  • 标记功能使其可编辑和用户可选择。然而,单击复选框没有任何作用,并且在加载时未选中复选框。

我在桌子上也有一个行双击事件 - 删除它没有帮助。

我究竟做错了什么?

【问题讨论】:

    标签: python qt


    【解决方案1】:

    回答我自己 - PySide 6.4.0 中有一个很大的问题,并通过 6.4.0.1 的修复解决了

    更多信息:https://forum.qt.io/topic/140632/qtableview-checkbox-is-never-checked

    错误报告:https://bugreports.qt.io/browse/PYSIDE-1930

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-19
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 2022-10-13
      • 2011-09-19
      相关资源
      最近更新 更多