如何删除QTreeWidgetItem的子元素

3

如何删除QTreeWidgetItem的子项。有时它会删除所有项目,有时则不会。

如何正确删除子项。

下面是我的函数,用于删除子项和添加新子项:

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个回答

4

你的示例无法正常工作,因为你试图在迭代过程中删除项。每次删除一项后,其他项将向下移动。所以一旦过了半路,循环就会开始给出无效的索引。

你可以通过按照相反的顺序删除项目来轻松解决这个问题。这样,每次删除一个项目后,其他项目将保持原位,并且所有索引都将保持有效:

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

关于您提出的文档问题: removeChild 方法会移除传入的项,但由调用者负责释放其内存。当然,Python 垃圾回收器通常会为您执行此操作,因此该文档方面更适用于 C++ 用户。

其实我现在感觉很愚蠢,不知道为什么之前没想到。 - Harwee
2
实际上,您可以每次删除第一个项目 for i in range(parent.childCount): parent.removeChild(parent.child(0)),因为下一个项目会向上移动,所以不需要反转。 - retnikt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接