如何删除 QTreeWidgetItem 的子项

Posted

技术标签:

【中文标题】如何删除 QTreeWidgetItem 的子项【英文标题】:How to remove children of QTreeWidgetItem 【发布时间】:2016-06-29 11:55:39 【问题描述】:

。有时它会删除所有项目,有时则不会。

如何正确删除子项。

这是我执行删除子项并添加新子项的函数

def update_children_cont(self,subDirs,parent):
    new_dir = subDirs
    for i in range(parent.childCount()):
        parent.removeChild(parent.child(i))
    print "child count should be 0",parent.childCount()
    parent.addChildren(self.tree_list_generator(new_dir))  

QWidgetItem.removeChild的文档中

删除由 child 指示的给定项目。 已移除的项目不会被删除

removed item will not be deleted是什么意思

【问题讨论】:

【参考方案1】:

您的示例不起作用,因为您在迭代它们时试图删除它们。移除每个项目后,其他项目将向下移动。所以一旦过了中途点,循环就会开始给出无效的索引。

您可以通过以逆序移除项目来轻松解决此问题。这样,在删除每个项目后,其他项目将保留在原处,并且所有索引都将保持有效:

    for i in reversed(range(parent.childCount())):
        parent.removeChild(parent.child(i))

至于您关于文档的其他问题:

removeChild 方法会移除传入的项目,但由调用者为其释放内存。当然,python 垃圾收集器通常会为您执行此操作,因此文档的这一方面与 C++ 用户更相关。

【讨论】:

其实我现在觉得很傻,不知道为什么我没想到 其实每次for i in range(parent.childCount): parent.removeChild(parent.child(0))都可以去掉第一个,因为下一个会向上移动,所以不需要反转。

以上是关于如何删除 QTreeWidgetItem 的子项的主要内容,如果未能解决你的问题,请参考以下文章

如何自动换行 QTreeWidgetItem

QTreeWidgetItem 不显示默认三角形 && 自定义TreeWidgetItem的widget && 子项Item与顶层TopLevelItem顶端对其-

索引 0 处的 QTreeWidgetItem.insertChild

JPA / Hibernate - 删除子项删除父项(从同一个表)

更改 QTreeWidgetItem 标志时防止递归

iOS 15.3+ SwiftUI中List子项目禁止被删除但头部仍显示删除按钮的解决