让我的垃圾收集保留对子小部件的 pyside/Qt 引用作为成员变量会妨碍正确清理吗?

Posted

技术标签:

【中文标题】让我的垃圾收集保留对子小部件的 pyside/Qt 引用作为成员变量会妨碍正确清理吗?【英文标题】:Does having my garbage collection keep pyside/Qt references to sub-widgets as member variables prevent proper cleanup? 【发布时间】:2012-04-13 22:00:29 【问题描述】:

从垃圾收集/正确清理的角度来看,这是我所拥有的:

class MyWidget(QWidget):
    def __init__(self,qtParent):
        QWidget.__init__(self,qtParent):
        
        self.mySubWidget = MySubWidget(self)  # <-- keeping a direct reference to the child

当我销毁 MyWidget 时,当我调用下面的代码时,mySubWidget 是否也会被 Qt/pyside/python 正确销毁?

setAttribute( Qt.DeleteOnClose, True)
myWidget.close()

或者,我应该像下面这样使用弱引用吗?

import weakref

class MyWidget(QWidget):
    def __init__(self,qtParent):
        QWidget.__init__(self,qtParent):
        
        self.mySubWidget = weakref.ref(MySubWidget(self))

【问题讨论】:

如果您对何时释放对象有疑问,请给它__del__ method 并找出答案。 【参考方案1】:

第一个很好。如果您在实例之外没有对创建的MySubWidget 的任何其他引用,那么当您删除MyWidget 实例时,它将被垃圾回收。

【讨论】:

以上是关于让我的垃圾收集保留对子小部件的 pyside/Qt 引用作为成员变量会妨碍正确清理吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 PySide (Qt) 中打开另一个程序并在原始窗口中显示

从宿主语言更新 QML 属性需要啥?

仅为 QTabWidget 中的选项卡显示工具提示,而不是整个小部件

确定JVM垃圾收集器的运行时

如何让我的 SwiftUI 小部件每分钟更新一次?

收集所有停靠的小部件及其位置