PYQT5学习笔记05——QObject父子对象API以及案例

news2024/11/24 18:45:35

一、父子对象API

  我们在这里简单演示一下父子对象API的具体用法以及代码实现,父子对象API有五个,分别是setParent、parent、children、findChild、findChildren,接下来对每一个API都具体演示一下。

1、setParent(parent)和parent()

  setParent方法的作用就是给一个QObject对象设置一个父对象,并且每个对象的父对象只能设置一个。parent的作用就是获取某个对象的父对象,代码如下:

obj1 = QObject()
obj2 = QObject()
print("obj1", obj1)
print("obj2", obj2)
obj1.setParent(obj2)  # 设置obj1的父对象为obj2
print(obj1.parent())

  效果如下,因为输出的是引用,所以我们只能先打印obj1obj2才能知道谁是谁的父对象:
在这里插入图片描述

  这里提醒一下,QLabel对象不能设置QObject对象为自己的父对象,一个可见控件和一个不可见控件是不能相互设置父子关系的!!!

2、children()

  children的作用是获取某个对象的所有直接子对象,我们可以先构造一个父子关系图,关系图如下:
在这里插入图片描述

  构造代码如下:

        obj0 = QObject()
        obj1 = QObject()
        obj2 = QObject()
        obj3 = QObject()
        obj4 = QObject()
        obj5 = QObject()
        #
        print("obj0", obj0)
        print("obj1", obj1)
        print("obj2", obj2)
        print("obj3", obj3)
        print("obj4", obj4)
        print("obj5", obj5)
        #
        obj1.setParent(obj0)
        obj2.setParent(obj0)


        obj3.setParent(obj1)
        obj4.setParent(obj2)
        obj5.setParent(obj2)

  我们可以尝试输出obj4的父亲和obj0的孩子,代码如下:

		print("obj4-parent", obj4.parent())
        print("obj0-child", obj0.children())  # 获取obj0的直接子对象,只有一级

  结果如下:
在这里插入图片描述

  很明显的看出,只输出了obj0的两个直接子对象。

3、findChild(参数1,参数2,参数3),findChildren(参数1,参数2,参数3)

  findChild函数的意思是,根据条件,在所有子对象中获取符合条件的一个子对象,或者说是获取一个指定名称和类型的子对象,即使有多个符合条件的子对象,也只会输出一个。三个参数的含义为:

参数一是子对象的类型,可以是单个类型变量(QObject)也可以是类型元祖((QPushButton, QLabel))
参数二是子对象的对象名称(或者说是对象ID),可以省略,省略的话就意味着从所有该类型变量中查找,输出查找到的第一个子对象
参数三有两个选择:
	1、Qt.FindDirectChildrenOnly:默认选项,递归查找,在所有子对象中查找
	2、Qt.FindDirectChildrenOnly:只在直接子对象中查找

  findChildren的参数和findChild的一样,只不过是返回所有查找到的子对象,而不是只返回一个,我们可以实验一下这两个函数:

		print(obj0.findChild(QObject))  # 找到obj0的类型为QObject的子对象,找到一个就结束
        print(obj0.findChildren(QObject))  # 找到obj0的类型为QObject的所有子对象,包括子孙对象

  效果如下:
在这里插入图片描述

  我们给obj3设置一个名称:

        obj3.setObjectName("3")

  按名称查找子对象:

print(obj0.findChildren(QObject, "3", Qt.FindChildrenRecursively))  # 找到obj0的类型为QObject,对象名称为3的子对象

结果如下:
在这里插入图片描述

二、具体案例

1、内存管理机制

  所有这些控件其实是一棵QObject继承树,所有的对象都是直接或者间接的继承自QObject,所以说QObjects在一棵对象树中组织他们自己。当创建一个QObject时,如果使用了其他对象作为父对象,那么,他就会被添加到父对象的children列表中。当父对象被销毁时,这个QObject对象也会被销毁。我们可以演示一下,在下面的代码中,obj1是局部变量,执行完函数会立即释放,而ojb2是obj1的子对象,被obj1所指向,不会被自动释放,我们监控obj2的释放信号,当obj2被释放时就打印信息,代码如下:

obj1 = QObject()
obj2 = QObject()

obj2.setParent(obj1)
# 监听obj2对象被释放
obj2.destroyed.connect(lambda : print("obj2对象被释放"))  # 当obj2对象销毁时,执行里面的lambda函数

  结果如下:
在这里插入图片描述

  所以父对象被销毁,子对象也会被销毁。

  对于QWidget组件来说,QWidget组件扩展了QObject对象的父子关系,在QWidget中,当一个控件设置了父控件时,会包含在父控件中,会受到父控件的区域裁剪(也就是子控件大小不能超过父控件),父控件被删除时子控件会自动删除。

  一个对话框,上面有很多操作按钮(取消,ok等),按钮和对话框本身是父子控件关系。我们操作的时候i,是操作的对话框控件本身,而不是其内部的子控件(按钮等)。当对话框被删除时,内部的子控件也会自动的删除。

2、对Qt控件的影响

  还有一个比较重要的作用就是对子控件样式的设置,可以将父控件的某一类子控件全部遍历出来,给每一个子控件都设置对应的样式,就不用一个个的去设置样式了,代码如下:

        win_root = QWidget()
        win_root.setWindowTitle("学习python")
        win_root.resize(500, 500)

        label = QLabel(win_root)  # 设置父控件第一种方式
        label.setText("社会我唐哥")
        # label.setStyleSheet("background-color: cyan;")

        label2 = QLabel(win_root)
        label2.move(50, 50)
        label2.setText("人狠话不多")
        # label2.setStyleSheet("background-color: cyan;")

        btn = QPushButton()
        btn.setText("按钮")
        btn.move(100, 100)
        btn.setParent(win_root)  # 设置父控件第二种方式

        for sub_widget in win_root.findChildren(QLabel):  # 给所有QLabel子对象设置背景颜色
            sub_widget.setStyleSheet("background-color: cyan;")

  效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国外导师对博士后申请简历的几点建议

正所谓“工欲善其事,必先利其器”,想要申请国外的博士后职位,就要准备好相应的申请文书材料。如果说Cover Letter是职位的窍门砖,那么申请者的简历就是争取职位的决定性筹码。 相信大家已经看过许多简历的模版了,但是…

c++自学笔记

本笔记为从菜鸟教程边学边记录的笔记---》C 教程 | 菜鸟教程 面向对象程序设计 封装(Encapsulation):封装是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。…

vsftpd.conf各参数含义

文章目录 初始vsftdp.conf翻译后需修改参数write_enableYES(启用任何形式的FTP写入命令)userlist_file/etc/vsftpd.user_list、userlist_enableYES、userlist_denyNOlocal_umask022(放开权限)chroot_local_userYES(限定…

【容器文件系统】了解容器 overlay 文件系统和 /var/lib/docker/overlay2下目录的作用

转载自 浅析 Docker overlay2 文件结构 docker(5): 层 朱双印 目的 有这个问题困惑着我:容器删除 docker rm 后,docker cp 到容器内的文件,在 /var/lib/docker/overlay2 目录中是否还会存在 答案:容器删除后 docker rm 后&…

银河麒麟操作系统,安装Gitlab 基于docker

不废话。直接上干货 操作系统信息 ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Sword) Kernel: 4.19.90-24.4.v2101.ky10.aarch64 Build: Kylin Linux Advanced Server release V10 (SP2) /(Sword)-aarch64-…

【电商必学】 WhatsApp 全新攻略:什么是交互式消息模板

网购与WhatsApp等社交通讯平台有着密不可分的关系,为什么这么说呢?因为基本上所有的网购的平台都会提供查询、下单方式给客户,而WhatsApp是全世界使用率最高的通讯平台,所以大部分电子商户都会选择WhatsApp Business与电子商务连接…

「C/C++」C/C++静态链接库与动态链接库

博客主页:何曾参静谧的博客 文章专栏:「C/C」C/C学习 目录 相关术语案例环境:Win10VS2019一、链接库介绍二、静态链接库(Static Library)2.1、静态库优缺点2.2、静态库的创建2.2.1、创建静态库项目2.2.2、添加.h头文件…

实战案例分享 | 临近假期,项目突发各种问题…

五一的调休补班一下子把三个星期的作息成功打乱,大家在吐槽的同时也不忘给自己延长假期,平时加班攒下的假期都充分利用上了。但办公室的项目经理小李这两天总长吁短叹,感觉假期也要随时随地办公。一问才知原来是临近假期时,项目突…

ARL灯塔(无需VPS版)

标题随便写,能看到都是有缘人 搭建灯塔那么繁琐的步骤,远不如爆破一个灯塔是吧(狗头) 而且还可能买不起VPS的情况(例如我) 那不如写一个脚本去爆破灯塔的弱口令 整治网络安全 从你我做起 fofa语法: icon_hash"1708240621"…

零售新时代,零售行业数字化破局的新路径

深夜11点,门店店长小张还在加班,因为小张还需要盘点今日销售额、库存等信息,这些整理好的数据需要手动录入至总公司的系统中。 多门店的零售行业中,这是他们每天的工作日常:门店先通过excel做手工报表,再把…

ubuntu20.04之--CUDA的安装

文章目录 CUDA文件的下载CUDA文件下载地址 CUDA文件的安装安装结果 环境变量的配置CUDA安装结果验证 CUDA文件的下载 CUDA文件下载地址 https://developer.nvidia.com/cuda-toolkit-archive 选择合适自己电脑的版本进行下载,下载命令如下: $ wget htt…

【产品分析】如何利用咖喱外卖店铺数据进行营销分析Python

在外卖平台上经营咖喱店铺时,海量的订单数据和用户评价等信息将成为商家优化营销策略的重要依据。然而,面对大量的数据,如果没有合适的分析方法,这些数据就变得毫无意义。本文将介绍如何使用Python中常用的可视化工具和方法&#…

Stable Diffusion使用方法

SD的本地安装教程有很多我就不重复了,这里主要是记录我在使用SD Webui的过程中遇到的问题,总结的一些提升出图效率,出好图概率的经验。 先搞几张看看效果 二次元妹妹 高达 ? Ok,以上只是一小部分成品 ,属…

2023年易派客工业品展圆满落幕 期待与您再次相遇

党的二十大指出,建设现代化产业体系。坚持把发展经济的着力点放在实体经济上,推进新型工业化,加快建设制造强国、质量强国、航天强国、交通强国、网络强国、数字中国。 中国石化深入学习贯彻党的二十大精神,以打造世界领先洁净能源…

【严重】Strapi <4.5.6 远程代码执行漏洞(POC)(CVE-2023-22621)

漏洞描述 Strapi是Node.js开发的开源内容管理系统,Users-Permission 插件的电子邮件模板系统用于管理与用户权限相关的电子邮件通知(默认启用)。 Strapi 4.5.6之前版本中,Users-Permission 插件的电子邮件模板系统存在 SSTI(服务器端模板注…

Linux必会100个命令(五十九)journalctl

不带参数,将输出所有的日志。 使用-r参数,输出为反序 使用-f查看最新的日志 使用-n 输出指定行数 使用--since和--until输出一段时间内的日志 查看昨天的日志: journalctl --since yesterday 查看10点以后2小时的日志: journal…

票务将引领生活方式

随着五一假期临近,很多人已经开始筹划假期出行计划,门票作为出行中最重要的一环,也成为了大家关注的重点。因为门票不仅能看出景区的人气,也能体现出景区的特色。 虽然现在很多景区都有数字化票务系统,但大多只能实现…

制药专业转行软件测试,带我的师傅在这干了两年半,最终还是跑路了......

故事的开始 最近这几天有点忧伤,因为带我的师傅要跑路了,嗯,应该说已经跑路了,他是制药专业的,已经在这个公司干了两年半了。其实今年3月份的时候他就跟我说他要跑路了,然后我说,要不你先把五一…

成人高考入学考试,考什么内容?

一、成考考试科目考试总分:高起专(450分)、高起本(600分)、专升本(450) 高起专主要考:语文、数学(文数/理数)和外语 高起本主要考:语文、数学(文…

一款支持全文检索、工作流审批、知识图谱的企事业知识库

一、项目介绍 一款全源码,可二开,可基于云部署、私有部署的企业级知识库云平台,一款让企业知识变为实打实的数字财富的系统,应用在需要进行文档整理、分类、归集、检索、分析的场景。 获取方式q:262086839 为什么建立知识库平台&…