QTreeWidget中的目录树

2 投票
1 回答
2414 浏览
提问于 2025-04-16 09:27

我正在使用 zipfiletarfile 这两个Python模块来打开、提取和压缩文件包。
我需要在一个QTreeWidget中显示文件包的结构,但我不知道该怎么做。为了获取信息,我使用了来自 这个文件infos(path) 函数。 我想得到类似于这个(来自Ark)的结构:
alt text

举个例子,如果我收到这些文件名: ('GCI/PyFiles/prova3.py', 'GCI/', 'GCI/PyFiles/', 'GCI/Screenshots/', 'GCI/prova2.py', 'prova.py'),我希望在我的QTreeWidget中得到这样的结果:

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

谢谢,
rubik

1 个回答

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', '']]

撰写回答