我想用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标准,有什么最简单的方法可以让这个排序工作呢?
我找到了一个适合我的案例的解决方案,基于以下假设:这三行。
model.setRootPath(directory)
tree.setRootIndex(self.model.index(directory))
tree.setSortingEnabled(True)
似乎它们必须按照这个特定的顺序,当然模型根路径和树根索引必须指向同一个目录(在调试过程中,我试着将它们设置为不同的目录,只是想看看当树只显示模型数据的一个子集时,会发生什么,但正如预期的那样,它破坏了应用程序中的多个东西)。
此外,任何自定义行(比如处理你的自定义列)必须发生在根索引设置,和排序启用之间。我不知道这是否真的是一个普遍的规则,它看起来有点武断,但在我的项目中,事实证明调用setSortingEnabled()作为最后一步是至关重要的,以使其工作。
如果你的自定义列不包含简单的文本(或任何不容易排序的东西,在我的例子中是一个组合框),或者它们是隐藏的,你最好将该列从排序中排除。这不是强制性的,但对我来说,这导致其他列的响应时间更快。