带有QFileSystemModel的QTreeView无法正常工作

时间:2019-07-25 03:09:16

标签: python pyqt pyqt5 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

1 个答案:

答案 0 :(得分:0)

如果对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_())