我正在使用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)
答案 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一段时间。这不是因为模型,而是视图为每个扩展项目做了相当多的工作,事情加起来。