Pyqt5 deleteLater() VS sip.delete()

Zid*_*dan 5 python pyqt pyqt5

sip.delete()我想了解使用和删除小部件(包括它的布局和此布局中的子项)之间有什么区别deleteLater()。我知道这一点removeWidget()setParent(None)只是从布局中删除小部件,但它并没有从内存中删除对象本身。如果我想从内存中删除一个对象,我应该使用哪个?我知道这个问题以前被问过,但我希望得到详细的答案:)

eyl*_*esc 4

我建议您阅读这个答案,因为我将使用其中解释的几个概念。

用于sip.delete()直接从包装器调用 C++ 对象的析构函数,如下所示:

delete wraper_instance->_cpp_object;
Run Code Online (Sandbox Code Playgroud)

相反, sdeleteLater()的方法QObject发送事件,以便事件循环调用 C++ 对象的析构函数,如下所示:

  1. 发布 QDeferredDeleteEvent。
  2. 运行所有待处理事件。
  3. 摧毁该物体。
  4. 发出被破坏的信号。

为什么 QObjects 作为 的替代品deleteLater()好吧,直接删除 QObject 可能是不安全的,例如,我们假设直接调用析构函数删除了某些 QWidget(它是 QObject),但在应用程序的另一部分之前,它要求更新整个 GUI,因为 GUI没有通知删除对象将导致未分配的内存被访问,从而导致应用程序崩溃。

因此,如果你想删除 aQObject那么使用 更安全deleteLater(),对于其他 C++ 对象(如 QImage、QPixmap、QGraphicsItems 等),你应该使用sip.delete().

欲了解更多信息,请阅读: