排序 QTreeView 的最简单方法

Posted

技术标签:

【中文标题】排序 QTreeView 的最简单方法【英文标题】:Easiest way for sorting a QTreeView 【发布时间】:2020-04-23 13:52:07 【问题描述】:

我正在尝试使用 PySide2 在 Python 3.6 中做一些基本的 Qt 文件管理器应用程序。代码是这样的:

class MainWidget(QWidget):
    startDir = "."

    def __init__(self):
        super().__init__()
        isDirselectDone = self.selectContentDir()
        if isDirselectDone:
            self.model = QFileSystemModel()
            self.model.setRootPath(self.startDir)
            self.tree = QTreeView()
            self.tree.setModel(self.model)
            self.tree.setSortingEnabled(True)
            self.tree.show()

    def selectContentDir(self):
        print("Selecing game content folder")

        self.startDir = QFileDialog.getExistingDirectory()

        if(len(self.startDir) == 0):
            print("Game content folder loading cancelled")
            return False

        print("Trying to load ", self.startDir)
        return True

我的问题是,无论所选目录的内容是什么,视图都不会对文件进行排序。我可以点击哦标题,小箭头正在改变,但一切都保持加载顺序。

我试图寻找解决方案,但答案要么说你只需要调用 setSortingEnabled() 并且一切都神奇地工作(事实并非如此),要么他们描述了一些涉及从 QAbstractTreeSuperAncientGodItemViewDelegate 继承的巫术魔法仪式,然后重新实现 Qt 库的一半,最后通过连接各处的插槽和信号创建一个类似 Tartarus 的迷宫。

那么根据最新的 Qt 标准进行排序的最简单/最简单的方法是什么?

【问题讨论】:

真奇怪,我对你的代码做了一些修改,它对我来说可以正常工作:gist.github.com/eyllanesc/7f6419f94788ce95760847358e229a46 只需复制粘贴您的版本即可。然而,这个问题实际上出现在一个更复杂的代码环境中,我也有 QtApplication 设置,以及正确的树根索引集。我发布的是最简单的问题形式,我可以在没有完整应用程序复杂性的情况下重现该问题。您知道根本的区别是什么吗?可能像设置调用的顺序一样? 【参考方案1】:

基于以下假设,我找到了适合我的案例的解决方案: 这三行:

     model.setRootPath(directory)
     tree.setRootIndex(self.model.index(directory))
     tree.setSortingEnabled(True)

似乎它们必须按照这个特定的顺序排列,当然模型根路径和树根索引必须指向同一个目录(在调试过程中我试图将它们设置为不同的,只是为了看看当树只显示了模型数据的一个子集,但正如预期的那样,它破坏了应用程序中的多个内容)。

此外,任何自定义行(例如处理自定义列)都必须在根索引设置和排序启用之间发生。我不知道这是否真的是一般规则,这似乎有点武断,但在我的项目中,最后一步调用 setSortingEnabled() 是至关重要的,以使其正常工作。

如果您的自定义列不包含简单的文本(或任何不易排序的内容,在我的情况下为组合框)或者它们被隐藏,您最好将该列排除在排序之外。这不是强制性的,但对我来说,它可以加快其他列的响应时间。

【讨论】:

以上是关于排序 QTreeView 的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

在 QTreeView 中找到 QModelIndex 可见行的更简单方法

根据Java中的值对地图进行排序的最简单方法是啥?

上传和排序大型数据集(400GB+)的最简单/非技术友好的方法是啥?

关于冒泡排序的最简单方法和进一步的优化

将数据从父表和子表加载到 DataGridView 的最简单方法,可以进行排序

从 Perl 中的哈希中获取具有最高值的键的最简单方法是啥?