Изменить Root путь модели во время выполнения - PyQt5 - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть QWidget, где я использую QTreeView и QFileSystemModel.

Я создал функцию, которая получает путь. Если это правильный путь, я ожидаю, что TreeView обновит свой root до указанного пути.

Эта часть до сих пор работает без нареканий. Но если путь не указан, я хочу вернуть TreeView в исходное состояние.

Эту часть мне не удается решить.

Вопрос в том, что необходимо для обновления TreeView?

Мой пример кода:

import sys
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtGui as qtg
from PyQt5 import QtCore as qtc


class FolderView(qtw.QWidget):
    def __init__(self):
        super().__init__()
        self.init_me()

    def init_me(self):
        self.model = qtw.QFileSystemModel()
        home_location = qtc.QStandardPaths.standardLocations(qtc.QStandardPaths.HomeLocation)[0]
        self.index = self.model.setRootPath(home_location)

        self.tree = qtw.QTreeView()
        self.tree.setModel(self.model)
        self.tree.setCurrentIndex(self.index)

        self.tree.setAnimated(False)
        self.tree.setIndentation(20)

        self.tree.setSortingEnabled(True)

        window_layout = qtw.QVBoxLayout()
        window_layout.addWidget(self.tree)

        self.setLayout(window_layout)

        self.show()            

    def set_root(self, path):
        if len(path) == 0:

        ## RETURN BACK TO NORMAL ##
            self.model.setRootPath(path)
            self.tree.setCurrentIndex(self.index)

        else:
        ## ONLY SHOW DATA FROM THE GIVEN PATH ##
            self.tree.setRootIndex(self.model.index(path))

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    mw = FolderView()
    sys.exit(app.exec())

1 Ответ

1 голос
/ 27 февраля 2020

Когда вы открываете модель, значением по умолчанию rootIndex() является неверный индекс.

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

Чтобы вернуться к исходной форме, вам нужно установить для root фактическую root модели, которую можно получить, создав новый экземпляр QModelIndex () :

Создает новый пустой модельный индекс. Этот тип модельного индекса используется для указания того, что позиция в модели недействительна.

Итак, решение заключается в следующем:

    self.tree.setRootIndex(qtc.QModelIndex())
...