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

Posted

技术标签:

【中文标题】Python(PyQT):如何在没有最后一个孩子的 QTreeWidget 中插入 XML 文件【英文标题】:Python (PyQT): How to insert a XML file in QTreeWidget without the last child 【发布时间】:2022-01-10 17:01:28 【问题描述】:

我将 XML 文件插入到 QTreeWidget 中。我想展示所有元素,没有一个特殊的孩子。

这是 XML 文件的样子:

<dir name="Work space" id="directory_0">
    <dir name="Directory 1" id="directory_1">
       <document name="Document 1" id="document_1_1">
            <slot name="Slot 1" id="slot_1_1_1"></slot>
            <slot name="Slot 2" id="slot_1_1_2"></slot>
            <slot name="Slot 3" id="slot_1_1_3"></slot>
            <slot name="Slot 4" id="slot_1_1_4"></slot>
        </document>
       <document name="Document 2" id="document_1_2"></document>
       <document name="Document 3" id="document_1_3"></document>
       <document name="Document 4" id="document_1_4">
            <slot name="Slot 1" id="slot_1_4_1"></slot>
            <slot name="Slot 2" id="slot_1_4_2"></slot>
            <slot name="Slot 3" id="slot_1_4_3"></slot>
        </document>
       <document name="Document 5" id="document_1_5"></document>
       <document name="Document 6" id="document_1_6"></document>
   </dir>
   <dir name="Directory 2" id="directory_2">
       <document name="Document 1" id="document_2_1"></document>
       <document name="Document 2" id="document_2_2"></document>
       <document name="Document 3" id="document_2_3"></document>
       <dir name="Directory 3" id="directory_3"></dir>
       <dir name="Directory 4" id="directory_4"></dir>
  </dir>
</dir>

我当前的 QTreeWidget 看起来像这样: IMAGE QTREEWIDGET

但我希望它在不修改 XML 文件的情况下看起来像这样: Image how I want it to look

而且我不知道如何为目录元素放置与称为文档的元素不同的图标。 例如,元素具有一个图标,而该元素具有另一个图标。

这是我在 QTreeWidget 中显示 XML 文件的代码:

    def displayTree(tree,childs):
        for child in childs:
            branch = QTreeWidgetItem([child.attrib.get("id")])
            branch.setIcon(0, QtGui.QIcon("resources/icons/document.png"))

            if(child.find("slot")):
                print("slot")
            
            tree.addChild(branch)
            tree.setIcon(0, QtGui.QIcon("resources/icons/folder.png"))

            displayTree(branch, child)

        self.iface.list_view.hide()

    displayTree(tree, fileOpen)

我在分支if(child.findall("slot")):上方添加了这段代码,现在它没有显示它包含在插槽中的元素。

        def displayTree(tree,childs):
            for child in childs:
                if(child.findall("slot")):
                    print("slot")
                else:
                    branch = QTreeWidgetItem([child.attrib.get("id")])
                    branch.setIcon(0, QtGui.QIcon("resources/icons/document.png"))
                    
                    tree.addChild(branch)
                    tree.setIcon(0, QtGui.QIcon("resources/icons/folder.png"))

                    displayTree(branch, child)

            self.iface.list_view.hide()

        displayTree(tree, fileOpen)

After adding the code, the element containing the slot is not visible

【问题讨论】:

那么,实际上你不想添加那些属于“slot”类型的子项? @musicamante 只是他们我不想添加。我将它们添加到另一个列表中,我希望他不要在这里显示它们。 所以,如果你不想要它们,只需检查if child.find("slot") 创建分支之前,如果它确实是一个插槽,那么在做任何其他事情之前返回。 @musicamante 我把那段代码放在了分支上面,但它保持不变的预览。 我不知道你说的如何,如果还是不行,edit你的问题并添加新代码。 【参考方案1】:

只有当child.findall("slot") 没有返回真实值时,您才应该添加孩子;在这种情况下,您可以继续递归调用 displayTree 并将图标设置为文件夹,否则您可以假设它是文档并设置相关图标:

        def displayTree(tree,childs):
            for child in childs:
                branch = QTreeWidgetItem([child.attrib.get("id")])

                tree.addChild(branch)

                if child.findall("slot"):
                    branch.setIcon(0, QtGui.QIcon("resources/icons/document.png"))
                else:
                    branch.setIcon(0, QtGui.QIcon("resources/icons/folder.png"))
                    displayTree(branch, child)

            self.iface.list_view.hide()

        displayTree(tree, fileOpen)

【讨论】:

谢谢兄弟,我需要这样的东西。

以上是关于Python(PyQT):如何在没有最后一个孩子的 QTreeWidget 中插入 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5番外篇:PyQt5与Opencv的小小融合

如何使用 python 在 Maya 中设置目录?目前使用 PyQt4,但愿意接受任何建议

PyQt5 样式表用于 QWidget 的孩子更改 QWidget

如何通过 python/pyqt 创建 Windows 7 跳转列表?

如何在 windows python 上安装 Pyqt5

如何在 PyQt5 Python 中的 QDial 上显示标记