Если документы проверены:
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