PySide: QFileSystemModel - Показать / показать корневой элемент - PullRequest
0 голосов
/ 22 ноября 2018

Я использую QFileSystemModel для отображения подкаталогов установленного корневого пути в QTreeView.Работает все отлично, но было бы очень приятно увидеть элемент Root, так как он сейчас скрыт.

model = QtGui.QFileSystemModel()
model.setRootPath(path)

treeview.setModel(model)
treeview.setRootIndex(model.index(path))
treeview.show()

РЕДАКТИРОВАТЬ: ОС Windows 7

1 Ответ

0 голосов
/ 22 ноября 2018

Идея состоит в том, чтобы использовать в качестве корневого родительского каталога и фильтровать дочерние каталоги, для этого я создал QSortFilterProxyModel, который получает индекс из нужного каталога, но вы должны передать ему QPersistentModelIndex, поскольку последний является постоянным в отличие от QModelIndex, который можетбыть измененным в любой момент.

import os
from PySide import QtCore, QtGui

class FileProxyModel(QtGui.QSortFilterProxyModel):
    def setIndexPath(self, index):
        self._index_path = index
        self.invalidateFilter()

    def filterAcceptsRow(self, sourceRow, sourceParent):
        if hasattr(self, "_index_path"):
            ix = self.sourceModel().index(sourceRow, 0, sourceParent)
            if self._index_path.parent() == sourceParent and self._index_path != ix:
                return False
        return super(FileProxyModel, self).filterAcceptsRow(sourceRow, sourceParent)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    path = # ...
    parent_dir = os.path.abspath(os.path.join(path, os.pardir))
    treeview = QtGui.QTreeView()
    model = QtGui.QFileSystemModel(treeview)
    model.setRootPath(QtCore.QDir.rootPath())
    proxy = FileProxyModel(treeview)
    proxy.setSourceModel(model)
    proxy.setIndexPath(QtCore.QPersistentModelIndex(model.index(path)))
    treeview.setModel(proxy)
    treeview.setRootIndex(proxy.mapFromSource(model.index(parent_dir)))
    treeview.expandAll()
    treeview.show()
    sys.exit(app.exec_())
...