Pyqt5 deleteLater() VS sip.delete()

问题描述 投票:0回答:1

我想了解一下,在删除一个widget(包括它的布局和这个布局中的子节点)的时候,使用 sip.delete()deleteLater(). 我知道 removeWidget()setParent(None) 只是将widget从layout中删除,但并没有从内存中删除对象本身。如果我想从内存中删除一个对象,我应该使用哪种方法?我知道这个问题以前有人问过,但我希望得到详细的回答:)

python pyqt pyqt5
1个回答
3
投票

我推荐你阅读 本回答 因为我将使用那里解释的几个概念。

在这里,我想说的是 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().

更多信息请阅读。

© www.soinside.com 2019 - 2024. All rights reserved.