当setSortingEnabled(True)时,QTableView + QFileSystemModel不排序

时间:2018-04-10 16:27:21

标签: python windows qt5 pyqt5 qtableview

考虑以下代码段:

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)如果enable为true,   允许对表进行排序并立即触发调用   sortByColumn()与当前的排序部分和顺序   注意:属性sortedEnabled的Setter函数。另请参见isSortingEnabled()。

1 个答案:

答案 0 :(得分:0)

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

即:model.setRootPath(QDir.rootPath())改变model.setRootPath('D:/'),它就可以正常工作了。或者甚至更好,从初始路径中提取字母,这样您就不会对任何内容进行硬编码。