簡體   English   中英

使用 Python 中的 dict 和列表為 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']

現在我必須按父/子轉換和排序整個列表,最后它應該是這樣的,這樣我就可以在 QTreeView 中使用它:

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

我用兩個 for 循環嘗試過,但我太愚蠢了..

有人可以告訴我一個簡單的例子嗎?

或者 QtTreeView/QTreeWidget 本身有更簡單的方法嗎?

如果我理解您的問題,您想從 dict 構建一個 treewidget 嗎? 如果是這樣,這是 Pyside2 的一個非常快速的示例(我認為 PyQt5 對於 Treewidget 沒有問題)。

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()

如果您只想將列表轉換為 dict 以便在 treewidget 中使用它,您可以嘗試以下操作:

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)

上面的代碼來自這個主題: Stackoverflow

現在你有一個 dict 可以與第一個代碼塊一起使用!

我希望它會幫助你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM