問題描述
我正在學習 pyqt 中的模型/視圖架構,但是當我遵循 ,2) 指出:
<塊引用>緩存和性能
QFileSystemModel 不會獲取任何文件或目錄,直到調用 setRootPath().這將防止在此之前對文件系統進行的任何不必要的查詢,例如列出 Windows 上的驅動器.與 QDirModel 不同,QFileSystemModel 使用單獨的線程來填充本身所以它不會導致主線程作為文件系統掛起正在被查詢.調用 rowCount() 將返回 0,直到模型填充目錄.
QFileSystemModel 保存一個包含文件信息的緩存.緩存是使用 QFileSystemWatcher 自動保持最新.
<小時><塊引用>
QModelIndex QFileSystemModel::setRootPath(const QString &newPath)
集合模型正在監視的目錄到 newPath 通過在其上安裝文件系統觀察程序.對文件的任何更改和此目錄中的目錄將反映在模型中.如果路徑改變,將發出 rootPathChanged() 信號.
注意:此功能不會改變模型的結構或修改視圖可用的數據.換言之,根"模型未更改為僅包含文件和目錄文件系統中newPath指定的目錄.
強調我的
加載過程在不同的線程中執行,并且加載是異步完成的,因此在您發出請求時,模型尚未加載.
解決方案:
解決方案是在加載后請求信息,該信息將通過 的 noreferrer">
:directoryLoaded
信號QFileSystemModel
from PyQt5.QtCore import pyqtSlot, QDir從 PyQt5.QtWidgets 導入 QApplication、QFileSystemModel、QPushButton類 DemoB(QPushButton):def __init__(self, parent=None):super().__init__(父)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(自我,目錄):parentIndex = self.model.index(目錄)對于范圍內的行(self.model.rowCount(parentIndex)):index = self.model.index(row, 0, parentIndex)打印(索引,index.data())如果 __name__ == "__main__":導入系統應用程序 = QApplication(sys.argv)w = DemoB()w.show()sys.exit(app.exec_())
I am learn about Model/View architecture in pyqt, but when i follow the Using model indexes instruction and try to write a demo in pyqt5 style.The QModelIndex couldn't get child node information?
The code:
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())
The result:
My folder:
Explanation:
As the docs(1, 2) points out:
Caching and Performance
QFileSystemModel will not fetch any files or directories until setRootPath() is called. This will prevent any unnecessary querying on the file system until that point such as listing the drives on Windows.Unlike QDirModel, QFileSystemModel uses a separate thread to populate itself so it will not cause the main thread to hang as the file system is being queried. Calls to rowCount() will return 0 until the model populates a directory.
QFileSystemModel keeps a cache with file information. The cache is automatically kept up to date using the QFileSystemWatcher.
QModelIndex QFileSystemModel::setRootPath(const QString &newPath)
Sets the directory that is being watched by the model to newPath by installing a file system watcher on it. Any changes to files and directories within this directory will be reflected in the model.If the path is changed, the rootPathChanged() signal will be emitted.
Note: This function does not change the structure of the model or modify the data available to views. In other words, the "root" of the model is not changed to include only files and directories within the directory specified by newPath in the file system.
emphasis mine
The loading process is executed in a different thread and the loading is done asynchronously, so at the time you make the request the model is not yet loaded.
Solution:
The solution is to request the information after it has been loaded that will be notified through the directoryLoaded
signal of QFileSystemModel
:
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_())
這篇關于為什么我的 QFileSystemModel QModelIndex 無法獲取子節點信息?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!