我有一个带有自定义模型的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
根据医生,我有:
CheckStateRole
setData
函数,用正确的索引和角色很好地调用了CheckStateRole
的data
函数,强制返回
我也有一个表上的行双击事件-删除它没有帮助。
我做错了什么?
发布于 2022-11-10 06:59:08
回答我自己-- PySide 6.4.0
中有一个很大的问题,并通过修复6.4.0.1
来解决。
这里有更多信息:https://forum.qt.io/topic/140632/qtableview-checkbox-is-never-checked
https://stackoverflow.com/questions/74380799
复制