QTreeWidget中的目录树

时间:2011-01-05 16:18:07

标签: python directory pyqt4 qtreewidget

我正在使用zipfiletarfile Python模块来打开,提取和压缩档案。
我需要在QTreeWidget中显示存档结构,我不知道如何继续。要获取信息,请使用this file中的infos(path)函数。 我想得到这样的东西(来自方舟):
alt text

例如,如果我收到此文件名:('GCI/PyFiles/prova3.py', 'GCI/', 'GCI/PyFiles/', 'GCI/Screenshots/', 'GCI/prova2.py', 'prova.py'),我想获取此信息:

- prova.py
- GCI/
    |
    |- prova2.py
    |- PyFiles/
             |- prova3.py
    |- Screenshots/

在我的QTreeWidget中。

谢谢你, 魔方

1 个答案:

答案 0 :(得分:1)

我不确定QTreeWidget是如何随意获取数据的,但这是在内存中构建结构的一种(可能是坏方法)。

x = ('GCI/PyFiles/prova3.py', 'GCI/', \
     'GCI/PyFiles/', 'GCI/Screenshots/', \
     'GCI/prova2.py', 'prova.py')

structure = {}
for fn in x:
    path = fn.split('/')

    tmpd = structure
    for p in path[:-1]:
        try:
            tmpd = tmpd[p]
        except KeyError:
            tmpd = tmpd[p] = {}

    tmpd[path[-1]] = None

这将为您提供一个字典structure,每个键都是另一个字典(表示文件夹)或None表示该键是文件。

更好的方法是创建一个这样的类:

class Node(object):
    def __init__(self):
        self.dirs = {}
        self.files = []

或类似的东西,你可以填充。如果我在QT编程时记得正确,那么QTreeWidget需要一个数据源,这样你基本上可以找出该源的样子并适当地填充它。也有可能选择这样做,

[sp for _,sp in sorted(
         (len(splitpath),splitpath) for splitpath in
            (path.split('/') for path in x)
         )
    ]

会让你回头:

[['prova.py'], ['GCI', ''], ['GCI', 'prova2.py'], 
 ['GCI', 'PyFiles', ''], ['GCI', 'PyFiles', 'prova3.py'], 
 ['GCI', 'Screenshots', '']]