【问题标题】:Why my QFileSystemModel QModelIndex couldn't get child node infomation?为什么我的 QFileSystemModel QModelIndex 无法获取子节点信息?
【发布时间】:2020-03-04 15:28:10
【问题描述】:

我正在学习 pyqt 中的模型/视图架构,但是当我按照Using model indexes 指令并尝试编写 pyqt5 样式的演示时,QModelIndex 无法获取子节点信息?

代码:

class DemoB(QPushButton):
    def __init__(self):
        super().__init__()

        self.clicked.connect(self.on_clicked)

    def on_clicked(self, checked):
        model = QFileSystemModel()
        model.setRootPath(QDir.homePath())
        parentIndex = model.index(QDir.homePath())
        print(parentIndex.data() )
        print(parentIndex, model.rowCount(parentIndex), QDir.homePath())
        for row in range(model.rowCount(parentIndex)):
            index = model.index(row, 0, parentIndex)
            print(index, index.data())

结果:

我的文件夹:

【问题讨论】:

    标签: python pyqt pyqt5 qfilesystemmodel


    【解决方案1】:

    解释:

    正如文档(1, 2) 指出的那样:

    缓存和性能

    QFileSystemModel 不会获取任何 文件或目录,直到调用 setRootPath()。这将防止 在此之前对文件系统进行的任何不必要的查询,例如 列出 Windows 上的驱动器。

    与 QDirModel 不同,QFileSystemModel 使用单独的线程来填充 本身所以它不会导致主线程作为文件系统挂起 正在被查询。调用 rowCount() 将返回 0,直到模型 填充目录。

    QFileSystemModel 保存一个包含文件信息的缓存。缓存是 使用 QFileSystemWatcher 自动保持最新。


    QModelIndex QFileSystemModel::setRootPath(const QString &newPath)

    集合 模型正在监视的目录到 newPath 通过 在其上安装文件系统观察程序。对文件的任何更改和 此目录中的目录将反映在模型中。

    如果路径改变,将发出 rootPathChanged() 信号。

    注意:此功能不会改变模型的结构或 修改视图可用的数据。换言之,“根” 模型未更改为仅包含文件和目录 文件系统中newPath指定的目录。

    强调我的

    加载过程在不同的线程中执行,并且加载是异步完成的,因此在您发出请求时,模型尚未加载。

    解决方案:

    解决方法是在加载后请求信息,通过QFileSystemModeldirectoryLoaded信号通知:

    from PyQt5.QtCore import pyqtSlot, QDir
    from PyQt5.QtWidgets import QApplication, QFileSystemModel, QPushButton
    
    
    class DemoB(QPushButton):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.clicked.connect(self.on_clicked)
            self.model = QFileSystemModel(self)
            self.model.directoryLoaded.connect(self.on_directoryLoaded)
    
        @pyqtSlot()
        def on_clicked(self):
            self.model.setRootPath(QDir.homePath())
    
        @pyqtSlot(str)
        def on_directoryLoaded(self, directory):
            parentIndex = self.model.index(directory)
            for row in range(self.model.rowCount(parentIndex)):
                index = self.model.index(row, 0, parentIndex)
                print(index, index.data())
    
    
    if __name__ == "__main__":
        import sys
    
        app = QApplication(sys.argv)
        w = DemoB()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多