QFileSystemModel中setRootPath和setRootIndex之间的区别

时间:2018-05-15 19:35:45

标签: python python-3.x pyqt pyqt5 qfilesystemmodel

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

1 个答案:

答案 0 :(得分:2)

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

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

enter image description here

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

如果QFileSystemModel是树类型的模型,那么它的根目录为QModelIndex,这可以代表任何目录,因此要确定根是什么{{3方法:

  

QModelIndex QFileSystemModel :: setRootPath(const QString& newPath)

     

将模型正在监视的目录设置为newPath by   在其上安装文件系统观察程序。对文件和文件的任何更改   此目录中的目录将反映在模型中。

     

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

     

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

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

  

void QAbstractItemView :: setRootIndex(const QModelIndex& index)

     

将根项目设置为给定索引处的项目。

总之,QFileSystemModelrootPath表示文件将被监控的根,并且视图有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_())

setRootIndex()