微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何删除所有topLevel QTreeWidgetItems 和secondLevel QTreeWidgetItems 没有孩子?

如何解决如何删除所有topLevel QTreeWidgetItems 和secondLevel QTreeWidgetItems 没有孩子?

我在 Python 3.9.6 上使用 PyQt6。

我有一个三级QTreeWidget,意思是所有顶级项都有子项,顶级项的子项也有子项,顶级项的孙子项没有子项。

它的结构是这样的:

Tree                level 0
    Artist          level 1
        Album       level 2
            Song    level 3

我有一些删除歌曲节点的代码,也就是三级节点,只有三级节点会被直接删除

很明显,当删除专辑中的所有歌曲时,专辑将是空的,我想删除所有空的专辑,这与链中的另一个操作相关联:当删除某个艺术家的所有专辑时,艺术家也应该被删除

所以这就变成了:删除所有没有子级的二级项,然后删除所有没有子级的一级项。

这是我尝试过的,显然它不起作用也不应该起作用:

count = tree.topLevelItemCount()
for i in range(count):
    node = tree.topLevelItem(i)
    num = node.childCount()
    for j in range(num):
        child = node.child(j)
        if child.childCount() == 0:
            sip.delete(child)
    if node.childCount() == 0:
        sip.delete(node)

因为当项目被删除时,索引会发生变化,所以简单的 for 循环不应该工作。

而且我不能使用 while 循环,因为我不想清空所有内容,所以我不知道如何在这里使用 while 循环而不让它永远运行。

那么如何做到这一点?

解决方法

我已经想通了,我只需要在删除之前使用列表理解获取所有顶级项,然后使用第一个循环的结果使用另一个列表理解来获取第二级项。

然后直接遍历第二个推导的结果,不用index,因为for循环是单向的,保证当前项之后的项都存在于树中,直接删除而不是index就可以了。

然后循环第一次推导的结果,直接去掉项。

代码:

count = tree.topLevelItemCount()
nodes = [tree.topLevelItem(i) for i in range(count)]
children = [node.child(j) for node in nodes for j in range(node.childCount())]
for child in children:
    if child.childCount() == 0:
        sip.delete(child)
for node in nodes:
    if node.childCount() == 0:
        sip.delete(node)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。