如何在 Qt 中制作部分可编辑的树模型
Posted
技术标签:
【中文标题】如何在 Qt 中制作部分可编辑的树模型【英文标题】:How to make a partially editable tree model in Qt 【发布时间】:2021-12-03 23:07:27 【问题描述】:我想更改 qt 提供的可编辑树视图示例,以便第一列不可编辑,而下一列是。
这里是回购: https://github.com/pyqt/examples/tree/master/itemviews/editabletreemodel
我知道这与标志有关。在editabletreemodel.py
他们有一个类TreeModel
。
def flags(self, index):
if not index.isValid():
return 0
return Qt.ItemIsEditable | super(TreeModel, self).flags(index)
我可以从 Qt.ItemIsEditable 更改为 Qt.ItemIsSelectable,这会使所有字段都无法编辑。但这不是我想要的
基本上我想让Title
列可选择并且Description
列可编辑,我怎样才能得到这种行为?
【问题讨论】:
请记住,问题通常应该是独立的(记住:问题不仅应该帮助您,而且将来任何时候寻找类似问题的任何人):维护者可能在某个时候的存储库将删除它,特别是考虑到链接的存储库不是官方的(PyQt 不在 GitHub 上)。为了将来参考,请考虑提供minimal reproducible example:在您的情况下,没有必要在示例中使用自定义模型,因为基本的 QStandardItemModel 就足够了。 【参考方案1】:只需检查flags()
实现中的索引列,然后使用排他二元运算符删除ItemIsEditable
标志:
def flags(self, index):
flags = super(TreeModel, self).flags(index)
if index.column() == 0:
flags &= ~Qt.ItemIsEditable
return flags
这是假设您使用的是始终提供可编辑项目的超类,否则只需添加标志(默认 QAbstractItemModel 仅返回可选择和启用的项目):
def flags(self, index):
flags = super(TreeModel, self).flags(index)
if index.column() > 0:
flags |= Qt.ItemIsEditable
return flags
【讨论】:
是的,第二个片段对我有用,因为该示例使用 QAbstractItemModel。但是,我在文档 doc.qt.io/qt-5/qabstractitemmodel.html 中找不到 QAbstratItemModel 的默认标志为 Selectable 。我在哪里可以找到此类信息? @JoãoRamiro 就在flags
文档中:“基类实现返回启用该项目(ItemIsEnabled)并允许选择它(ItemIsSelectable)的标志组合。”以上是关于如何在 Qt 中制作部分可编辑的树模型的主要内容,如果未能解决你的问题,请参考以下文章