在 Python 中为 QTreeView 创建一个带有字典和列表的树结构

Creating a tree structure with dict and lists in Python for QTreeView

首先我没有练习,我试图在 Python 3.8 中创建一个树结构来提供我的 QTreeView。

我阅读了 zfs (subprocess.check_output) 的输出并将所有内容拆分成一个包含池名称的列表:

示例列表:

pools = ['deadpool','deadpool/Backup','deadpool/Photos','deadpool/Photos/Foobar']

现在我必须按 parent/child 对整个列表进行转换和排序,最后它应该看起来像这样,这样我就可以在 QTreeView 中使用它了:

{'deadpool': 
            {
              'Backup': {},
              'Photos': {'Foobar': {}},
            } 
}

我用两个 for 循环试过,但我太笨了..

谁能告诉我一个简单的例子?

或者 QtTreeView/QTreeWidget 本身有更简单的方法吗?

如果我理解你的问题,你想从 dict 构建一个 treewidget 吗?如果是,这是一个非常快速的 Pyside2 示例(我认为 Treewidget 的 PyQt5 没有问题)。

data = {
'deadpool':{
    'Backup': {},
    'Photos': {
        'Foobar': {}
        }
    }
}

def build_tree(data=None, parent=None):
    for key, value in data.items():
        item = QTreeWidgetItem(parent)
        item.setText(0, key)
        if isinstance(value, dict):
            build_tree(data=value, parent=item)


window = QWidget()
layout = QVBoxLayout()
window.setLayout(layout)
treewidget = QTreeWidget()
build_tree(data=data, parent=treewidget)
layout.addWidget(treewidget)
window.show()

如果您只想将列表转换为字典以便在树形小部件中使用它,您可以试试这个:

data = ['deadpool','deadpool/Backup','deadpool/Photos','deadpool/Photos/Foobar']

tree = {}
for path in data:                # for each path
    node = tree                   # start from the very top
    for level in path.split('/'): # split the path into a list
        if level:                 # if a name is non-empty
            node = node.setdefault(level, dict())
                              # move to the deeper level
                              # (or create it if unexistent)

print(tree)

上面的代码来自这个主题:

现在你有一个 dict 可以用于第一个代码块!

希望对您有所帮助!