完全展开代表QFileSystemModel的QTreeView

时间:2014-07-23 20:30:12

标签: python pyqt4 qtreeview

我正在使用QTreeView来显示目录的内容。它按预期工作,除了我希望能够显示所有层次结构打开它。我希望QTreeView.expandAll()方法可以做到这一点,但实际上看起来并不像在扩展根目录之前实际存在子目录的ModelItems。 为了查看完全展开的目录结构,我需要做什么?

import sys
from PyQt4 import QtGui

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

    self.initUI()

    def initUI(self):
        self.treeView = QtGui.QTreeView(self)
        self.treeView.setGeometry(0,0, 600, 800)
        self.model = QtGui.QFileSystemModel()
        self.path = "/opt"
        self.model.setRootPath(self.path)
        self.treeView.setModel(self.model)
        self.treeView.setRootIndex(self.model.index(self.path))
        self.treeView.expandAll()

        self.setGeometry(300, 300, 600, 800)
        self.setWindowTitle('Toggle button')
        self.show()

def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

通过执行os.walk并在该目录上手动执行setRootPath,我得到了所需的结果,如下所示,但我想知道是否有更“内置”的Qt方式。

    for root, dirs, files in os.walk(self.path):
        self.model.setRootPath(root)

1 个答案:

答案 0 :(得分:2)

首先,你确定要这样做吗? QFileSystemModel懒惰地为a reason加载项目。查询完整的目录树可能会非常费时费力。

对于更多Qt版本,您可以使用directoryLoaded信号在子文件夹到达时获取和展开它们:

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

    self.initUI()

    def initUI(self):
        self.treeView = QtGui.QTreeView(self)
        self.treeView.setGeometry(0,0, 600, 800)
        self.model = QtGui.QFileSystemModel()
        self.path = "/opt"
        self.model.setRootPath(self.path)
        self.treeView.setModel(self.model)
        self.treeView.setRootIndex(self.model.index(self.path))
        # self.treeView.expandAll()  Not needed

        self.setGeometry(300, 300, 600, 800)
        self.setWindowTitle('Toggle button')

        self.model.directoryLoaded.connect(self._fetchAndExpand)

        self.show()

    def _fetchAndExpand(self, path):
        index = self.model.index(path)
        self.treeView.expand(index)  # expand the item
        for i in range(self.model.rowCount(index)):
            # fetch all the sub-folders
            child = index.child(i, 0)
            if self.model.isDir(child):
                self.model.setRootPath(self.model.filePath(child))

注意:对于大型目录树,这可能会冻结GUI一段时间。这不是因为模型,而是视图为每个扩展项目做了相当多的工作,事情加起来。