【问题标题】:Pyqt5 deleteLater() VS sip.delete()Pyqt5 deleteLater() VS sip.delete()
【发布时间】:2020-05-24 01:55:00
【问题描述】:

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

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

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

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

    delete wraper_instance->_cpp_object;
    

    deleteLater()QObjects 的一个方法,它发送一个事件,以便事件循环调用C++ 对象的析构函数,类似于:

    1. 发布 QDeferredDeleteEvent。
    2. 运行所有未决事件。
    3. 销毁对象。
    4. 发出被破坏的信号。

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

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

    更多信息请阅读:

    【讨论】:

    • Lesiok 在 Qt 论坛上:“Qt::WA_DeleteOnClose 设置调用了小部件 deleteLater”链接:qtcentre.org/threads/…
    • 那么python中的del和widget.deleteLater()有什么区别?
    • @bactone deleteLater 删除 C++ 对象(实际上是告诉事件循环尽可能删除它,这是一个异步 C++ 删除)。 python中“del”的含义与C++中的“delete”不同。
    • @eyllanesc,经过一番阅读,我认为 del x 只是删除了引用或指针 x,而不是它指向的对象。只有当对象没有其他引用时,才会被垃圾回收。 deleteLater() 似乎也删除了引用,对吗?
    猜你喜欢
    • 2015-07-26
    • 2017-04-21
    • 2012-09-19
    • 2017-05-15
    • 2014-04-18
    • 2023-02-05
    • 1970-01-01
    • 2023-03-14
    • 2023-04-01
    相关资源
    最近更新 更多