QTreeView с QFileSystemModel работает неправильно

Я устанавливаю корневой путь QFileSystemModel, а затем устанавливаю его как модель QTreeView, но если я пытаюсь найти индекс определенного файла, он дает мне D: я уверен, что файл есть!

self.model = QtWidgets.QFileSystemModel()
self.model.setNameFilters(['*.ma'])
self.model.setFilter(QtCore.QDir.Files)#QtCore.QDir.AllDirs | QtCore.QDir.NoDotAndDotDot | QtCore.QDir.AllEntries)
self.model.setNameFilterDisables(False)
self.model.setRootPath(path)
self.tree_local_file.setModel(self.model)
self.tree_local_file.setRootIndex(self.model.index(path))

# ...
# then
# ...

for i in range(self.model.rowCount()):
    index = self.model.index(i, 0)
    file_name = str(self.model.fileName(index))
    file_path = str(self.model.filePath(index))
    print(file_path) # this gave me -> D:/
    if file_name == master_file_name:
        self.tree_local_file.setCurrentIndex(index)
        self.open_file()
        break
# or

index = (self.model.index(master_file_name[1]))
print(self.model.filePath(index)) # this is giving me nothing

person Saeid Gholizade    schedule 25.07.2019    source источник


Ответы (1)


Если документы проверены:

QModelIndex QFileSystemModel::setRootPath(const QString &newPath)

Устанавливает каталог, который отслеживается моделью, в newPath путем установки на нем наблюдателя за файловой системой. Любые изменения файлов и каталогов в этом каталоге будут отражены в модели.

Если путь изменен, будет выдан сигнал rootPathChanged().

Примечание. Эта функция не изменяет структуру модели и не модифицирует данные, доступные для представлений. Другими словами, «корень» модели не изменяется и включает только файлы и каталоги в каталоге, указанном newPath в файловой системе.

(выделено мной)

Из того, что понятно, корень модели никогда не менялся, поэтому, если вы хотите получить доступ к элементам ниже rootPath, вы должны получить QModelIndex, связанный с этим путем, а затем получить своих детей.

С другой стороны, QFileSystemModel выполняет свои задачи в другом потоке, чтобы избежать некоторой блокировки графического интерфейса, поэтому вы не получите адекватный маршрут при изменении rootPath, но, по крайней мере, вам нужно дождаться выдачи сигнала directoryLoaded, указывающего, что работа сделано на нить окончена.

Учитывая вышеизложенное, возможное решение:

from PyQt5 import QtCore, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.tree_local_file = QtWidgets.QTreeView()
        self.setCentralWidget(self.tree_local_file)

        path = "/foo/path/"

        self.model = QtWidgets.QFileSystemModel()
        self.model.setNameFilters(["*.ma"])
        self.model.setFilter(
            QtCore.QDir.Files
        )  # QtCore.QDir.AllDirs | QtCore.QDir.NoDotAndDotDot | QtCore.QDir.AllEntries)
        self.model.setNameFilterDisables(False)
        self.model.setRootPath(path)
        self.tree_local_file.setModel(self.model)
        self.tree_local_file.setRootIndex(self.model.index(path))

        self.model.directoryLoaded.connect(self.onDirectoryLoaded)

    @QtCore.pyqtSlot()
    def onDirectoryLoaded(self):
        root = self.model.index(self.model.rootPath())
        for i in range(self.model.rowCount(root)):
            index = self.model.index(i, 0, root)
            file_name = self.model.fileName(index)
            file_path = self.model.filePath(index)
            print(file_path)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
person eyllanesc    schedule 25.07.2019