我设置了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

最佳答案

如果docs被检查:


   QModelIndex QFileSystemModel :: setRootPath(const QString&newPath)
  
  通过以下方式将模型正在监视的目录设置为newPath
  在其上安装文件系统监视程序。对文件和
  该目录中的目录将反映在模型中。
  
  如果更改路径,将发出rootPathChanged()信号。
  
  注意:此功能不会更改模型的结构或
  修改视图可用的数据。换句话说,
  模型未更改为仅包含文件和目录中的文件和目录
  文件系统中newPath指定的目录。


(强调我的)

据了解,模型的根目录从未改变,因此,如果要访问rootPath下的项目,则必须获取与该路径关联的QModelIndex,然后获取子目录。

另一方面,QFileSystemModel在另一个线程中执行其任务以避免对GUI的某些阻塞,因此在更改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_())

09-05 06:38