PyQt中所有的对象都是直接或者间接继承自QObject。当创建一个QObject时,如果使用了其他对象作为其父对象时,那么,他就会被添加到父对象children()列表中。当父对象被销毁时,这个QObject也会被销毁。

代码验证父子关系

neicunguanlidef中,验证obj1与obj2之间的关系。

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


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QObject学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        # self.objectNameAndProperty()
        self.neicunguanli()

    def neicunguanli(self):
        obj1 = QObject()
        self.obj1 = obj1
        obj2 = QObject()
        obj2.setParent(obj1)  # 设置obj1为obj2的父对象

        # 测试消灭obj1,obj2是否会被消灭
        # 监听obj2对象被释放
        obj2.destroyed.connect(lambda: print("obj2被释放"))

        del self.obj1  # 删除父对象子对象会被删除


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

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

在QWeidget中,当一个控件设置了父控件:

  • 包含在控件的内部
  • 受父控件区域的限制
  • 父控件被删除后,子控件也会被删除

应用场景

父控件子控件案例

类似这种窗口,一个控件里面包含了很多子控件。当关闭父控件之后,子窗口也能相应关闭。

如果一个控件没有任何父控件,那么就会被当成顶层控件(窗口),多个顶层窗口相互独立。

如果想要一个控件包含在另一个控件内部,就需要设置父子关系。这样显示位置就会受到父控件的约束,其生命周期也被父控件接管。

案例演示

设置两个窗口,分别为win1和win2。为了区别分享设置了两个背景颜色。自古红蓝出CP。

然后把win2当做子控件放到win1里面。

需要注意的是,由于父子关系,子控件的显示不会从父控件里面溢出来,尺寸上只能大于或小于父控件,大于的话会被裁剪。

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


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

    app = QApplication(sys.argv)
    # 设置两个窗口,分别为win1和win2
    win1 = QWidget()
    win1.setStyleSheet("background-color: red")
    win1.show()

    win2 = QWidget()
    win2.setStyleSheet("background-color: blue")
    win2.resize(100, 100)
    win2.setParent(win1)  # 设置父子关系
    win2.show()
    sys.exit(app.exec_())

显示结果


版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/PyQtParentAnli.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!
▶ 站长邮箱 [email protected][email protected] ,如不方便留言可邮件联系。

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