对QTreeView进行排序的最简单方法

问题描述 投票:0回答:1

我想用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标准,有什么最简单的方法可以让这个排序工作呢?

python sorting pyside2 qtreeview qfilesystemmodel
1个回答
0
投票

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

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

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

此外,任何自定义行(比如处理你的自定义列)必须发生在根索引设置,和排序启用之间。我不知道这是否真的是一个普遍的规则,它看起来有点武断,但在我的项目中,事实证明调用setSortingEnabled()作为最后一步是至关重要的,以使其工作。

如果你的自定义列不包含简单的文本(或任何不容易排序的东西,在我的例子中是一个组合框),或者它们是隐藏的,你最好将该列从排序中排除。这不是强制性的,但对我来说,这导致其他列的响应时间更快。

© www.soinside.com 2019 - 2024. All rights reserved.