【问题标题】:Fully expand a QTreeView representing a QFileSystemModel完全展开代表 QFileSystemModel 的 QTreeView
【发布时间】:2014-07-23 20:30:11
【问题描述】:

我正在使用 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)

【问题讨论】:

    标签: python pyqt4 qtreeview


    【解决方案1】:

    首先,您确定要这样做吗? 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 冻结一段时间。这不是因为模型,而是视图为每个展开的项目做了相当多的工作,而且事情加起来了。

    【讨论】:

      【解决方案2】:

      我找到了解决办法:

          if choice != 1:
              self.model.directoryLoaded.connect(self.expand)
          else:
              pass
              
          
      def expand(self):
          self.emp.treeViewFolderView.expandAll()
      

      directoryLoaded 是解决方案!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-23
        • 1970-01-01
        • 2018-12-22
        • 2022-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多