def flags(self, index):
if not index.isValid():
return Qt.ItemIsEnabled
if index.column() in self.booleanSet:
return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
elif index.column() in self.readOnlySet:
return Qt.ItemIsSelectable | Qt.ItemIsEnabled
else:
return QSortFilterProxyModel.flags(self, index)
def data(self, index, role):
if not index.isValid():
return QVariant()
if index.column() in self.booleanSet and role in (Qt.CheckStateRole, Qt.DisplayRole):
if role == Qt.CheckStateRole:
value = QVariant(Qt.Checked) if index.data(Qt.EditRole).toBool() else QVariant(Qt.Unchecked)
return value
else: #if role == Qt.DisplayRole:
return QVariant()
else:
return QSortFilterProxyModel.data(self, index, role)
def setData(self, index, data, role):
if not index.isValid():
return False
if index.column() in self.booleanSet and role == Qt.CheckStateRole:
value = QVariant(True) if data.toInt()[0] == Qt.Checked else QVariant(False)
return QSortFilterProxyModel.setData(self, index, value, Qt.EditRole)
else:
return QSortFilterProxyModel.setData(self, index, data, role)
使用组合框项模型,因为项支持复选框 您只需将项目标记为可由用户选中,并设置初始选中状态以使复选框出现(仅当存在有效状态时才显示)
下面是一个最小的子类示例:
我在How do I create a tree view (with checkbox) inside a combo box - PyQt回答了一个类似的问题,但无论如何,为了完整起见,我将您粘贴在这里:
您应该创建一个模型,在data和SetData方法中支持Qt.CheckStateRole,在flags方法中支持标记Qt.ItemIsUserCheckable。
我在这里粘贴一个我在一个项目中使用的示例,这是一个QSortFilterProxyModel泛型实现,可以在任何模型中使用,但是您可以在模型实现中使用相同的思想,显然我在这个子类中使用的内部结构不是PyQt中直接使用的,而是附加到我的内部实现(self.booleanSet和self.readOnlySet)。
当我需要这样做时,我会想出一个更简单的解决方案(至少不需要将QCombobox子类化)。这对我有效。 也就是说,创建一个带有选中操作的菜单,并将其设置为一个按钮。然后将菜单或操作连接到插槽。
Qt中的代码(还没有使用PyQt,对不起,我希望您可以移植那个代码,对我来说似乎更简单)是这样的:
希望这有帮助
相关问题 更多 >
编程相关推荐