如何在 QTreeView 或 QListView 中设置 ItemFlag?

Posted

技术标签:

【中文标题】如何在 QTreeView 或 QListView 中设置 ItemFlag?【英文标题】:How to set ItemFlag in QTreeView or QListView? 【发布时间】:2021-02-01 11:35:22 【问题描述】:

更新1: 基于 QFileSystemModel() 的 QTreeView。

如何在指定的树项上“setFlags”?

在子类 QFileSystemModel() 中?

class MyTreeModel(QFileSystemModel):
    def __init__(self, parent=None):
        super(MyTreeModel, self).__init__(parent)
        # fake code:
        if current_index.parent() == treeView.rootIndex():
            # it is a second level folder.
            # set this tree item not selectable.
            current_index.setFlags(^ Qt.ItemIsSelectable)

【问题讨论】:

什么项目和基于什么?该标志可以在运行时出于任何原因更改吗?模型是静态的还是布局发生变化?标志总是由模型提供(意味着flags()必须重新实现);如果您希望能够以编程方式为特定索引设置标志,则应保留每个索引及其自定义标志(如果有)的内部引用。也就是说,请先提供minimal, reproducible example,这个问题太宽泛了。 【参考方案1】:

我从这里得到灵感: TreeView in Python+QT

与setData()类似,不能将setData()设置为QFileSystemModel,但可以修改data()在从模型中读取数据时添加代码。

你不能直接setFlags()到QFileSystemModel,但是你可以修改flags()来改变返回的数据。

class MyTreeModel(QtWidgets.QFileSystemModel):
    #...
    def flags(self, index):
        flags = super(MyTreeModel, self).flags(index)
        # Determine directory level.
        if self.index_level(index) == 2:
            flags = flags ^ QtCore.Qt.ItemIsSelectable
        return flags

【讨论】:

以上是关于如何在 QTreeView 或 QListView 中设置 ItemFlag?的主要内容,如果未能解决你的问题,请参考以下文章

QListView的使用

如何在 QTableView 中打开 URL

Qt入门系列开发教程高级控件篇QTreeView树形视图

QT开发——QT单元视图组件

如何使Qt小部件可调整大小[重复]

如何隐藏 Qt QListView 或 QListWidget 中的选择矩形/虚线?