gpt4 book ai didi

python - 如何删除QTreeWidgetItem

转载 作者:太空狗 更新时间:2023-10-29 19:37:48 26 4
gpt4 key购买 nike

有几个网页说QTreeWidgetItem可以通过删除或者QTreeWidget.clearing来删除。但是我下面的代码示例似乎没有这样做。我做错了什么吗?

#!/usr/bin/python
import sys
from PySide.QtGui import QApplication, QWidget, QTreeWidget, QTreeWidgetItem
#from PyQt4.QtGui import QApplication, QWidget, QTreeWidget, QTreeWidgetItem # Result was the same with `PySide`
import time

class TreeWidgetItemChild(QTreeWidgetItem):
def __init__(self):
super(TreeWidgetItemChild, self).__init__()
print 'TreeWidgetItemChild init'

def __del__(self):
print 'TreeWidgetItemChild del'

def test_QTree_clear_children():
tree = QTreeWidget()
tree.setHeaderLabel('funksoul')
i = TreeWidgetItemChild()
tree.addTopLevelItem(i)
print 'Before clearing'
#tree.clear() # Didn't call destructor (__del__)
#tree.removeItemWidget (i, 0) # Didn't call destructor
#i.__del__() # Called destructor but it's called again afterward
del i # Didn't call destructor
time.sleep(1)
print 'After clearing'

if __name__ == '__main__':
app = QApplication(sys.argv)
test_QTree_clear_children()

打印为:

TreeWidgetItemChild init
Before clearing
After clearing
TreeWidgetItemChild del

在我看来 TreeWidgetItemChild 在进程终止时被删除,而不是通过我的任何删除操作。

最佳答案

Python 在内存管理/删除对象方面不同于 C++。 Python 有一个垃圾收集器 (GC),可以自动管理对象的销毁。当对象的引用计数达到零时,就会发生这种情况。

del i 仅表示“将引用计数减一”。它永远不会导致直接调用 __del__。对象的 __del__ 仅在引用计数达到零且即将被垃圾收集时调用。 (虽然这对于 CPython 是正确的,但不能保证每个实现都如此。它取决于 GC 实现。所以你根本不应该依赖 __del__)

简而言之,__del__ 的调用时间是不明确的。你不应该直接调用 __del__ (或任何其他 __foo__ 特殊方法)。事实上,由于上​​述原因,您应该完全(通常)避免使用 __del__

除此之外,还有一个问题。

tree.removeItemWidget(i, 0)

这不会从 QTreeWidget 中删除项目。顾名思义,它从项目中删除了一个 widget,而不是 QTreeWidgetItem。它对应于 setItemWidget 方法,而不是 addTopLevelItem 方法。

如果您需要从树中删除特定项目,您应该使用takeTopLevelItem

tree.takeTopLevelItem(tree.indexOfTopLevelItem(i))

tree.clear() 没问题。它将从树中删除每个顶级项目。

关于python - 如何删除QTreeWidgetItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13062327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com