QTableView + QFileSystemModel 在 setSortingEnabled(True) 时不排序

Posted

技术标签:

【中文标题】QTableView + QFileSystemModel 在 setSortingEnabled(True) 时不排序【英文标题】:QTableView + QFileSystemModel not sorting when setSortingEnabled(True) 【发布时间】:2018-04-10 16:27:21 【问题描述】:

考虑下面的sn-p:

import sys
import os
import time

from PyQt5.Qt import *  # noqa


class Foo(QTableView):

    def __init__(self, path, extensions, parent=None):
        super().__init__(parent)

        model = QFileSystemModel(self)
        model.setRootPath(QDir.rootPath())
        model.setFilter(QDir.NoDotAndDotDot | QDir.Files)
        model.setNameFilterDisables(False)
        self.setModel(model)

        self.setShowGrid(False)
        self.verticalHeader().hide()
        self.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
        self.setSelectionMode(QAbstractItemView.SingleSelection)

        self.change_path(path)

        self.setSortingEnabled(True)

    def change_path(self, path):
        model = self.model()
        index = model.index(str(path))
        self.setRootIndex(model.index(os.path.dirname(str(path))))
        self.scrollTo(index)
        self.setCurrentIndex(index)


def main():
    app = QApplication(sys.argv)
    file_view = Foo(__file__, ["*.*"])
    file_view.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

由于某种原因,当我单击标题时,行不会被排序,这是为什么呢?

文档说:

void QTableView::setSortingEnabled(bool enable) 如果启用为真, 启用对表的排序并立即触发对 带有当前排序部分和顺序的 sortByColumn() 注意:属性sortingEnabled的Setter函数。另请参见 isSortingEnabled()。

【问题讨论】:

我已经测试了你的代码,我发现它可以正常工作,我已经用 PyQt 5.10 对其进行了测试,在以下链接中有几张图片可以证明重新排序:imgur.com/a/mTuEg @eyllanesc 感谢您的努力!感谢#pyqt的一些人,我已经能够发现问题所在......我花了将近1个小时来缩小这个范围,这真的很难,因为我已经尝试了很多东西根本不考虑QDir.rootPaht():/,无论如何,ty。 Qt 处理通用格式,因此始终建议使用 Qt 为路由提供的方法,您应该指明操作系统。 【参考方案1】:

这种情况下的主要问题是QDir.rootPath() 默认提供C:/,而我使用的初始路径位于D:,因此要使其正常工作,您需要确保 setRootPath 匹配初始路径:

ie:将model.setRootPath(QDir.rootPath()) 更改为model.setRootPath('D:/'),它会正常工作。或者更好的是,从初始路径中提取字母,这样您就不会硬编码任何内容。

【讨论】:

以上是关于QTableView + QFileSystemModel 在 setSortingEnabled(True) 时不排序的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 QTableView 边框颜色?

QTableView - 排序标题

QTableView如何设置行高?

PyQt5 组件之QTableView

如何在调整 QTableView 大小时动态更改列数?

QTableView - 没有得到选择改变信号