Разница между setRootPath и setRootIndex в QFileSystemModel - PullRequest
0 голосов
/ 15 мая 2018

Я новичок в классе QFileSystemModel, но меня смущают функции setRootPath и setRootIndex

1 Ответ

0 голосов
/ 15 мая 2018

QFileSystemModel является моделью и наследуется от QAbstractItemModel, поэтому каждый элемент структуры имеет QModelIndex, связанный с ним

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

enter image description here

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_())

enter image description here

...