如何在 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 中制作部分可编辑的树模型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF 中创建可编辑的树列表视图?

Mailchimp - 如何制作可编辑的链接

如何在 Qt 中制作可展开/可折叠的部分小部件

如何使用 jQuery 制作可编辑的列表项?

如何在设计师的“收藏编辑器窗口”中制作可编辑的对象?

如何制作可编辑的假剑道网格特定列?