QFileSystemModel中的setRootPath和setRootIndex之间的区别

X-B*_*... 5 python pyqt qfilesystemmodel python-3.x pyqt5

我是QFileSystemModel类的新手,但我对setRootPath和setRootIndex的功能感到困惑

eyl*_*esc 5

QFileSystemModel是一个模型,继承自QAbstractItemModel,因此结构的每个元素都有一个QModelIndex关联

来自http://doc.qt.io/qt-5/model-view-programming.html#basic-concepts

在此处输入图片说明

QModelIndex是项的临时表示,用于存储其在结构中的位置信息。

QFileSystemModel是树类型的模型的情况下,它具有根a QModelIndex,并且它可以表示任何目录,因此要确定根是什么,可以使用以下setRootPath()方法:

QModelIndex QFileSystemModel :: setRootPath(const QString&newPath)

通过在模型上安装文件系统监视程序,将模型监视的目录设置为newPath。此目录中文件和目录的任何更改都将反映在模型中。

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

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

但也要记住,一个模型可以被多个视图使用,并且每个视图都可以显示模型的不同子部分(例如,不同的子目录),因此rootIndex(),模型的不应成为模型中显示的根。视图。为此,从其继承的视图QAbstractItemView具有setRootIndex()方法:

无效的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_())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明