如何在 QTreeWidget 中获取 XML 元素的 ID 并将新元素插入其中

Posted

技术标签:

【中文标题】如何在 QTreeWidget 中获取 XML 元素的 ID 并将新元素插入其中【英文标题】:How to get the ID of a XML element in a QTreeWidget and insert a new element into it 【发布时间】:2022-01-09 22:51:46 【问题描述】:

我将一个 XML 文件插入到 QTreeWidget 视图中,我想获取树中所选目录的 id 并将一个新的 XML 元素(目录)插入其中。

XML 文件基本上是什么样子的:

例如,我想点击directory 1 并在其中创建一个新目录或文档。我想获取所选目录的 ID 并通过 ID 在该元素中创建一个新目录。

    <dir name="Work space" id="directory_0">
        <dir name="Directory 1" id="directory_1">
           <document name="Document 1" id="document_1_1"></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"></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>
   </dir>

节目展示图片:

我设法获得了元素 ID,但我不知道如何插入新元素。

self.treeWidget.itemClicked.connect(self.onItemClicked)

def onItemClicked(self):
    item = self.treeWidget.currentItem()
    print(self.getParentPath(item))

def getParentPath(self, item):
    def getParent(item, outstring):
        if item.parent() is None:
            return outstring
        outstring = item.parent().text(0) + "/" + outstring
        return getParent(item.parent(), outstring)

    output = getParent(item, item.text(0))
    return output

例如,如果我想将目录 3 和目录 4 添加到目录 2,它会是这样的。

<dir name="Work space" id="directory_0">
    <dir name="Directory 1" id="directory_1">
       <document name="Document 1" id="document_1_1"></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"></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>

所以我需要列出所有目录以及我选择的一个以获取他的 id 并插入一个新目录。

【问题讨论】:

输出的xml应该是什么样子的? 如果您已经从 xml 创建了树,这似乎是一个奇怪的问题。 “我不知道怎么做”到底是什么意思?您无法解决哪些具体问题? @ekhumoro 是的,我把这个 XML 放在 qtreewidget 中,我截取了程序。当我从 qtreewidget 中选择一个目录并单击新目录图标时,我只想输入新目录的名称并将其添加到我在 qtreewidget 中选择的目录中的 xml 文件中 @bane 屏幕截图无关紧要 - 显示一些实际代码。你在哪里尝试自己解决这个问题?请收下tour 并阅读How to Ask。 【参考方案1】:

见下文

import xml.etree.ElementTree as ET


xml = '''<dir name="Work space" id="directory_0">
        <dir name="Directory 1" id="directory_1">
           <document name="Document 1" id="document_1_1"></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"></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>
   </dir>'''
  
root = ET.fromstring(xml)
folder = root.find('.//dir[@name="Directory 2"]')
for x in [3,4]:
  ET.SubElement(folder, 'dir','name':f'Directory x','id':f'directory_x')
ET.dump(root)

输出

<?xml version="1.0" encoding="UTF-8"?>
<dir name="Work space" id="directory_0">
   <dir name="Directory 1" id="directory_1">
      <document name="Document 1" id="document_1_1" />
      <document name="Document 2" id="document_1_2" />
      <document name="Document 3" id="document_1_3" />
      <document name="Document 4" id="document_1_4" />
      <document name="Document 5" id="document_1_5" />
      <document name="Document 6" id="document_1_6" />
   </dir>
   <dir name="Directory 2" id="directory_2">
      <document name="Document 1" id="document_2_1" />
      <document name="Document 2" id="document_2_2" />
      <document name="Document 3" id="document_2_3" />
      <dir name="Directory 3" id="directory_3" />
      <dir name="Directory 4" id="directory_4" />
   </dir>
</dir>

【讨论】:

以上是关于如何在 QTreeWidget 中获取 XML 元素的 ID 并将新元素插入其中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QTreeWidget/QTreeView 中获取行高

如何获取 QTreeWidget 可见区域中显示的所有项目?

当一个复选框被切换时,如何获取 QTreeWidget 项目的文本?

我在具有动态数据的 QtreeWidget 中的 QTreewidgetItem 中单击的编辑按钮

如何删除 QTreeWidget 的 currentItem? [关闭]

QTreeWidget 选择第一项