QObject内存管理机制

1、内存管理机制

 第一种情况:obj1会自动被释放,obj2绑在obj1上,所以obj1被释放之后,obj2也会被释放;程序结束,自动释放内存,所以obj1被自动释放掉了。

    def manage_memory(self):
        obj1 = QObject()
        obj2 = QObject()

        obj2.setParent(obj1)

        # 监听obj2对像被释放
        obj2.destroyed.connect(lambda : print("obj2对象被释放了"))

第二种情况,obj1不会被释放掉,将obj1作为self对象的属性。

    def manage_memory(self):
        obj1 = QObject()
        # 将obj1作为self对象的属性,
        # 相当于有指针指向obj1对像,所以不会被自动释放
        self.obj1 = obj1
        obj2 = QObject()

        obj2.setParent(obj1)

        # 监听obj2对像被释放
        obj2.destroyed.connect(lambda : print("obj2对象被释放了"))

第③种情况:将self.obj1释放掉,它对应的子对象也会被自动释放。

    def manage_memory(self):
        obj1 = QObject()
        # 将obj1作为self对象的属性,
        # 相当于有指针指向obj1对像,所以不会被自动释放
        self.obj1 = obj1
        obj2 = QObject()

        obj2.setParent(obj1)

        # 监听obj2对像被释放
        obj2.destroyed.connect(lambda : print("obj2对象被释放了"))

        del self.obj1

 即:当父对象被释放,子对象也会被自动释放。

2、将内存管理机制应用于QWidget种:

 父子对象的操作应用场景:

 案例:

 案例1:显示父子控件的关系

if __name__ == "__main__":
    app = QApplication(sys.argv)
    # window = Window()
    # window.show()

    win1 = QWidget()
    win1.setWindowTitle("红色")
    win1.setStyleSheet("background-color: red")
    win1.show()

    win2 = QWidget()
    win2.setWindowTitle("绿色")
    win2.setStyleSheet("background-color: green")
    #win2.setParent(win1)
    win2.resize(100, 100)
    win2.show()


    sys.exit(app.exec_())

案例2:

if __name__ == "__main__":
    app = QApplication(sys.argv)

    win_root = QWidget()
    label1 = QLabel()
    label1.setText("label1")
    label1.setParent(win_root)

    btn = QPushButton(win_root)
    btn.move(100, 100)
    btn.setText("btn")


    win_root.show()

    sys.exit(app.exec_())

案例3:

 

if __name__ == "__main__":
    app = QApplication(sys.argv)

    win_root = QWidget()
    label1 = QLabel()
    label1.setText("label1")
    label1.setParent(win_root)

    label2 = QLabel()
    label2.move(50, 50)
    label2.setText("label2")
    label2.setParent(win_root)

    label3 = QLabel()
    label3.move(80, 80)
    label3.setText("label1")
    label3.setParent(win_root)

    btn = QPushButton(win_root)
    btn.move(100, 100)
    btn.setText("btn")
    win_root.show()

    # 遍历win_root中所有的子控件
    for sub_widget in win_root.findChildren(QLabel):
        print(sub_widget)
        sub_widget.setStyleSheet("background-color:cyan;")

    sys.exit(app.exec_())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

。七十二。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值