Самый простой способ сортировки QTreeView - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь создать базовое c приложение для управления файлами Qt в Python 3.6 с PySide2. Код выглядит так:

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 () и все магически работает (что не так), или они описывают некоторые ритуалы магии вуду c, включающие наследование от QAbstractTreeSuperAncientGodItemViewDelegate, затем повторно реализуют половину библиотеки Qt и, наконец, создают лабиринт, похожий на тартар, соединяя слоты и сигналы повсюду.

Так какой самый простой / простой способ заставить эту сортировку работать в соответствии с последними стандартами Qt?

1 Ответ

0 голосов
/ 24 апреля 2020

Я нашел решение для моего случая, основываясь на следующих предположениях: Эти три строки:

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

Кажется, что они должны быть в указанном порядке c, и, конечно, корневой путь модели и Индекс дерева root должен указывать на один и тот же каталог (во время отладки я пытался установить их на разные, просто чтобы посмотреть, что происходит, когда дерево показывает только подмножество данных модели, но, как и ожидалось, оно сломало несколько вещей в приложение).

Кроме того, любые пользовательские строки (например, обработка пользовательских столбцов) должны происходить между настройкой индекса root и включением сортировки. Я не знаю, действительно ли это общее правило, оно кажется произвольным, но в моем проекте оказалось крайне важным вызвать setSortingEnabled () в качестве последнего шага, чтобы заставить его работать.

Если ваши пользовательские столбцы не содержат простой текст (или что-то непростое для сортировки, в моем случае это поле со списком) или они скрыты, вам лучше исключить этот столбец из сортировки. Это не обязательно, но для меня это привело к более быстрому времени отклика для других столбцов.

...