问题: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_())

在此处输入图像描述

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐