排序 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 可见行的更简单方法
上传和排序大型数据集(400GB+)的最简单/非技术友好的方法是啥?