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++对象的析构器,就像这样。

  1. post QDeferredDeleteEvent.
  2. 运行所有待处理的事件。
  3. 销毁对象。
  4. 发出销毁信号。

为什么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()解析

在调用 deleteLater() 后直接删除对 Qt 对象的 Python 引用是不是安全?

如果 QThread 的完成信号连接到 deleteLater,是不是有必要删除在 QThread 上运行的对象?