在 PyQt 中将 QTreeWidget 转换为嵌套字典

Posted

技术标签:

【中文标题】在 PyQt 中将 QTreeWidget 转换为嵌套字典【英文标题】:Converting a QTreeWidget to a nested dictionary in PyQt 【发布时间】:2021-12-15 12:22:12 【问题描述】:

我想这样做的原因是允许用户使用QTreeWidget 创建文件树,然后我想将该树提取到嵌套的dict 结构中,并以某种方式保存它。我考虑过使用txt 文件和eval 方法将所有保存的方案简单地加载到某个数组或另一个字典中,其中键是方案的名称,因此用户可以简单地选择一个方案或如果他们愿意,可以编辑它。这自然导致我不得不在用户选择编辑后将保存的dict 转换回QTreeWidget

虽然这是我的问题。

我已经能够使用递归函数成功导航QTreeWidget。我纠结的是创建嵌套dict 背后的逻辑。

以下是我目前想出的:

def tree_to_dict(self, parent, key):
    for i in range(parent.childCount()):
        cur_par = parent.child(i)
        if cur_par.childCount() == 0:
            try:
                if type(self.scheme[key]) is dict :
                    self.scheme[key][cur_par.text(0)] = 'E'
            except KeyError:
                key = cur_par.text(0)
                self.scheme[key] = 'E'
        else:
            key = cur_par.text(0)
            self.scheme[key] = 
            self.tree_to_dict(cur_par, key)

我知道这是错误的。这就是我需要帮助的原因。

上面的代码从下面的QTreeWidget生成下面的dict

a
b
    a
c

'a':'E', 'b':'a':'E', 'c':'E'

但应该是:

'a':'E', 'b':'a':'E', 'c':'E'

E 仅仅意味着不会有更多的子目录。

我已经看到了一些其他的实现,但它们非常令人困惑,我不太明白他们的逻辑。 This 与我在这里提出的问题几乎重复,但尚未得到回答。我已经尝试过调整他的实现,但它(无论如何对我来说)很复杂,很难适应我的程序结构。

【问题讨论】:

【参考方案1】:

您的实现可能过于复杂。

由于每个项目都是键,因此您需要递归迭代并返回该键的值。

如果项目没有子项,它将返回“E”,否则它将使用给定的子项再次调用该函数,依此类推。 该函数不需要 key 参数,因为它将由递归调用创建。

    def tree_to_dict(parent):
        childCount = parent.childCount()
        if not childCount:
            return 'E'
        content = 
        for row in range(childCount):
            child = parent.child(row)
            content[child.text(0)] = tree_to_dict(child)
        return content

然后,只需使用invisibleRootItem() 调用该函数。

【讨论】:

如果我将您对我在我提到的问题的答案传递给您,您会介意吗?只是为了帮助可能想要做同样事情的未来用户。也感谢您的协助。 @Christopher 对不起,我不明白你在问什么。

以上是关于在 PyQt 中将 QTreeWidget 转换为嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章

PyQt:使用 QDataStream 保存本机 QTreeWidget

PyQt4 中的多列(可能使用 QTreeWidget)

Python(PyQT):如何在没有最后一个孩子的 QTreeWidget 中插入 XML 文件

在 PyQt 中使用拖放重新排序 QTreeWidget 中的项目

PyQt5如何实现对QTreeWidget下所有Item的遍历

在PyQt5中的QTreeWidget和QListWidget之间拖动项目?