【发布时间】:2015-07-26 07:49:56
【问题描述】:
我有一个布局,我添加了很多自定义小部件,例如layout.addWidget(widget)。稍后我想删除所有这些自定义小部件并添加新小部件。当谈到deleteLater 和setParent(None) 时,我对最好的方法感到困惑。例如,这是我为布局中的所有小部件调用的清理函数:
def _removeFilterWidgetFromLayout(self, widget):
"""Remove filter widget"""
self._collection_layout.removeWidget(widget)
widget.setParent(None)
widget.deleteLater()
我怀疑并非所有这些行都需要正确清理小部件使用的内存。我不确定 C++ 和 Python 对 widget 的引用发生了什么。
以下是我对 PyQt 中对 QObjects 的 C++ 和 Python 引用的理解。
我相信,当您将小部件添加到布局时,小部件将成为布局的子级。所以,如果我打电话给removeWidget,那么父关系就被打破了,所以我必须自己清理 C++ 和 Python 引用,因为小部件没有其他父级。对setParent 的调用是删除与布局的父关系的显式方法。对 deleteLater 的调用旨在处理 C++ 引用。
Python 引用已被垃圾回收,因为 widget 变量超出范围,并且没有其他 Python 对象指向 widget。
我需要打电话给setParent 和deleteLater 还是deleteLater 足以正确清理这个问题?
附带说明,我发现在这种情况下调用setParent(None) 是一个非常昂贵的函数调用。通过删除这个调用,我可以大大加快我的整个清理过程。我不确定deleteLater 是否足以正确清理所有内容。这是line_profiler 的分析输出:
Line # Hits Time Per Hit % Time Line Contents
==============================================================
2167 @profile
2168 def _removeFilterWidgetFromLayout(self, widget):
2169 """Remove filter widget"""
2170
2171 233 1528 6.6 1.0 self._collection_layout.removeWidget(widget)
2172 233 143998 618.0 97.9 widget.setParent(None)
2173 233 1307 5.6 0.9 widget.deleteLater()
在使用 PyQt4 时,是否有一种“公认”的方式来进行清理?我应该使用setParent、deleteLater,还是两者都用?
【问题讨论】: