Pyqt5 deleteLater() VS sip.delete()
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pyqt5 deleteLater() VS sip.delete()相关的知识,希望对你有一定的参考价值。
我想了解一下,在删除一个widget(包括它的布局和这个布局中的子节点)的时候,使用 sip.delete()
和 deleteLater()
. 我知道 removeWidget()
和 setParent(None)
只是将widget从layout中删除,但并没有从内存中删除对象本身。如果我想从内存中删除一个对象,我应该使用哪种方法?我知道这个问题以前有人问过,但我希望得到详细的回答:)
我推荐你阅读 本回答 因为我将使用那里解释的几个概念。
在这里,我想说的是 sip.delete()
是用来直接从包装器中调用C++对象的析构器的,类似这样。
delete wraper_instance->_cpp_object;
取而代之的是 deleteLater()
的方法。QObject
的事件,使事件循环调用C++对象的析构器,就像这样。
- post QDeferredDeleteEvent.
- 运行所有待处理的事件。
- 销毁对象。
- 发出销毁信号。
为什么QObjects有作为替代的 deleteLater()
? 好吧,直接删除一个QObject可能是不安全的,例如,我们假设某个QWidget(这是一个QObject)被直接调用destructor删除,但在应用程序的另一部分中,它要求更新整个GUI,因为GUI没有被通知删除对象,然后将导致未分配的内存被访问,导致应用程序崩溃。
因此,如果你想删除一个 QObject
那么使用 deleteLater()
对于其他C++对象(如QImage, QPixmap, QGraphicsItems等),你应该使用 sip.delete()
.
更多信息请阅读。
以上是关于Pyqt5 deleteLater() VS sip.delete()的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 8 VS2013 中使用 si.lpReserved 2?
在 QObject 派生类的构造函数中使用 deleteLater
Qt文档阅读笔记-void QObject::deleteLater()解析
Qt文档阅读笔记-void QObject::deleteLater()解析