PyQt5中,有一个延迟删除的api,叫做deleteLater()。这个api的特点就是不会立即删除,而是在下一次消息循环中去删除。

obj.deleteLater()

  • 删除对象的api
  • 删除一个对象时,也会解除他与父对象之间的关系
  • 工作过程:deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象
  • 应用场景:想要移除某一对象的时候使用

测试deleteLater()

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("类型判定学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        self.DeleteObject()

    def DeleteObject(self):
        obj1 = QObject()
        obj2 = QObject()
        obj3 = QObject()

        obj3.setParent(obj2)
        obj2.setParent(obj1)

        obj1.destroyed.connect(lambda: print("obj1被释放"))
        obj2.destroyed.connect(lambda: print("obj2被释放"))
        obj2.destroyed.connect(lambda: print("obj3被释放"))

        obj2.deleteLater()
        print(obj1.children())  # 执行到这一步父子关系还在
        # 工作过程:deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象
        print("obj1还在吗?", obj1)
        print("obj2还在吗?", obj2)


# 方便在模板里进行调试
if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

运行结果:

[<PyQt5.QtCore.QObject object at 0x000001D7C4E6B9D0>]
obj1还在吗? <PyQt5.QtCore.QObject object at 0x000001D7C4E6B940>
obj2还在吗? <PyQt5.QtCore.QObject object at 0x000001D7C4E6B9D0>
obj1被释放
obj2被释放
obj3被释放

这个运行顺序就证明了他的工作过程:

运行顺序


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/deleteLater.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 06 月 30 日
如果觉得我的文章对你有用,请随意赞赏