QFileSystemModel中setRootPath和setRootIndex的区别
问题:QFileSystemModel中setRootPath和setRootIndex的区别
我是 QFileSystemModel 类的新手,但我对 setRootPath 和 setRootIndex 的功能感到困惑
解答
QFileSystemModel是一个模型,继承自QAbstractItemModel,因此结构的每个元素都有一个与之关联的QModelIndex
来自http://doc.qt.io/qt-5/model-view-programming.html#basic-concepts:

QModelIndex 是项目的临时表示,用于存储其在结构中的位置信息。
在QFileSystemModel是树类型模型的情况下,它有一个QModelIndex作为根,它可以代表任何目录,所以要确定根是什么,有setRootPath()方法:
QModelIndex QFileSystemModel::setRootPath(const QString &newPath)
通过在其上安装文件系统观察程序,将模型正在监视的目录设置为 newPath。对该目录中文件和目录的任何更改都将反映在模型中。
如果路径改变,将发出 rootPathChanged() 信号。
注意:此功能不会改变模型的结构或修改视图可用的数据。换句话说,模型的“根”没有更改为仅包括文件系统中由 newPath 指定的目录中的文件和目录。
但也要记住,一个模型可以被多个视图使用,每个视图可以显示模型的不同子部分(例如不同的子目录),因此模型的rootIndex()不应该是显示的根风景。为此,从QAbstractItemView继承的视图具有setRootIndex()方法:
void QAbstractItemView::setRootIndex(const QModelIndex & index)
将根项设置为给定索引处的项。
总之,QFileSystemModel有一个rootPath表示将监视文件的根目录,视图有一个rootIndex告诉他们要显示模型的哪个部分。
例子:
import sys
from PyQt5.QtCore import QDir
from PyQt5.QtWidgets import QFileSystemModel, QTreeView, QWidget, QHBoxLayout, QApplication
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
lay = QHBoxLayout(w)
model = QFileSystemModel()
model.setRootPath(QDir.rootPath())
for dirname in (QDir.rootPath(), QDir.homePath(), QDir.currentPath()):
view = QTreeView()
view.setModel(model)
view.setRootIndex(model.index(dirname))
lay.addWidget(view)
w.show()
sys.exit(app.exec_())

更多推荐

所有评论(0)