【发布时间】: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(以确保它返回正确的值) - 标记功能使其可编辑和用户可选择。然而,单击复选框没有任何作用,并且在加载时未选中复选框。
我在桌子上也有一个行双击事件 - 删除它没有帮助。
我究竟做错了什么?
【问题讨论】: