【python】QWidget父子关系,控件显示优先级原理剖析与应用实战演练

news2024/7/30 2:16:11

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战
景天的主页:景天科技苑

文章目录

  • QWidget父子关系
    • 1.QWidget父子关系常用API
    • 2.QWidget父子关系代码展示
    • 3.QWidget父子关系实战案例
  • QWidget层级显示控制
    • 1.正常情况下,多个控件,下方代码展示在最顶层
    • 2.层级控制实战案例

QWidget父子关系

在Qt中,QWidget及其子类是用于界面构建的基本单元。每个QWidget对象都可以有一个父对象,而在这个父对象的children()列表中,也能找到这个子对象。当父对象被销毁时,它的所有子对象也会被销毁。

1.QWidget父子关系常用API

childAt(x, y)
函数可以根据传入的坐标参数获取该QWidget中位于该坐标位置的子QWidget,如果该位置没有子QWidget则返回None。 x,y是相对于窗口的坐标

parentWidget()
函数可以获取当前QWidget的父QWidget,如果没有父QWidget则返回None。通过这个函数可以遍历组成QWidget树的所有QWidget。

childrenRect()
函数可以获取该QWidget中所有子QWidget的组合边界矩形(bounding rectangle),该矩形包括所有子QWidget的位置和大小。
可以利用这个函数来计算一个QWidget内所有子QWidget的相对位置和大小,方便进行布局和重绘。

2.QWidget父子关系代码展示

# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys


# 1. 创建一个应用程序对象
app = QApplication(sys.argv)

# 2. 控件的操作
# 2.1 创建控件
window = QWidget()
# 2.2 设置控件
window.setWindowTitle("QWidget父子关系")
window.resize(500, 500)

#在窗口里面添加三个标签子控件
label1 = QLabel(window)
# label1.setParent()
label1.setText("标签01")
label1.move(200, 200)

label2 = QLabel(window)
# label1.setParent()
label2.setText("标签02")
label2.move(50, 50)

label3 = QLabel(window)
# label1.setParent()
label3.setText("标签03")
label3.move(100, 100)


#查看(255, 255)这个位置是否有子控件
print(window.childAt(55, 55))
#打印某控件的父QWidget
print(label2.parentWidget())

#获取该QWidget中所有子QWidget的组合边界矩形(bounding rectangle),该矩形包括所有子QWidget的位置和大小
print(window.childrenRect())


# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

可以根据API获取子控件,判断某控件的父控件,子控件所在位置能画出的矩形等。
在这里插入图片描述

3.QWidget父子关系实战案例

要求:
创建一个窗口, 包含若干Label控件
点击哪个标签, 就让哪个标签背景变红
使用父控件处理, 不要使用自定义QLabel子类

# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys

#老式的自定义类点击改变背景颜色
# class Label(QLabel):
#     def mousePressEvent(self, QMouseEvent):
#         self.setStyleSheet("background-color: red;")


#根据父子关系。只有点击到子控件,才让子控件背景色变红
class Window(QWidget):
    #重写父对象的鼠标点击事件,来接收子控件传递来的事件消息

    def mousePressEvent(self, evt):
        local_x = evt.x()
        local_y = evt.y()
        #根据鼠标位置,查找是否有子控件
        sub_widget = self.childAt(local_x, local_y)
        #如果有,九江子控件背景颜色设为红色
        if sub_widget:
            sub_widget.setStyleSheet("background-color: red;")
        print("被点击了", local_x, local_y)

# 1. 创建一个应用程序对象
app = QApplication(sys.argv)

# 2. 控件的操作
# 2.1 创建控件
window = Window()
# 2.2 设置控件
window.setWindowTitle("父子关系案例")
window.resize(500, 500)

#循环创建几个子标签
#默认点击标签,标签并没有对事件进行处理。所以会向父对象传递,我们在父对象里面重写了mousePressEvent事件,来处理点击逻辑

for i in range(1, 5):
    label = QLabel(window)
    label.setText("标签" + str(i))
    label.move(40*i, 40*i)


# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

鼠标点到哪个控件。哪个控件变红
在这里插入图片描述

QWidget层级显示控制

在PyQt中,QWidget的层级控制允许对不同的QWidget进行层级关系的调整,从而决定它们在屏幕上的显示顺序。
以下是一些用于层级控制的常用API:
lower() 函数可以将一个QWidget置于其兄弟QWidget的底部,即降低其显示级别。
raise_() 函数可以将一个QWidget置于其兄弟QWidget的顶部,即提高其显示级别。
a.stakUnder(b) 函数可以将QWidget a置于QWidget b的面。

注意:以上以上操作专指同级控件

1.正常情况下,多个控件,下方代码展示在最顶层

# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys


# 1. 创建一个应用程序对象
app = QApplication(sys.argv)

# 2. 控件的操作
# 2.1 创建控件
window = QWidget()
# 2.2 设置控件
window.setWindowTitle("层级关系调整")
window.resize(500, 500)

label1 = QLabel(window)
label1.setText("标签1")
label1.resize(200, 200)
label1.setStyleSheet("background-color: red;")

label2 = QLabel(window)
label2.setText("标签2")
label2.resize(100, 100)
label2.setStyleSheet("background-color: green;")
label2.move(100, 100)




# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

运行:
通过运行结果我们看出:哪个控件后展示,它的级别就越高。
标签2在标签1的下方写的代码。标签2将与标签1重叠部分遮挡。标签2的级别比标签1高。
在这里插入图片描述

使用上述的API将标签2置于底层

label2.lower() #将标签2置于底层
# 或
# label1.raise_()  将标签1置于顶层
# 或
# label2.stackUnder(label1) 使标签2的级别低于标签1

可见,标签2被标签1遮挡,标签2的级别小于标签1
在这里插入图片描述

2.层级控制实战案例

创建一个窗口,在窗口中创建两个有部分重叠的标签,实现鼠标点击哪个标签,哪个标签就变为顶层。

代码展示:

# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys

class Label(QLabel):
    def mousePressEvent(self, evt):
        #点击哪个控件,就将哪个控件显示为顶层
        self.raise_()

# 1. 创建一个应用程序对象
app = QApplication(sys.argv)

# 2. 控件的操作
# 2.1 创建控件
window = QWidget()
# 2.2 设置控件
window.setWindowTitle("层级关系调整")
window.resize(500, 500)

label1 = Label(window)
label1.setText("标签1")
label1.resize(200, 200)
label1.setStyleSheet("background-color: red;")

label2 = Label(window)
label2.setText("标签2")
label2.resize(200, 200)
label2.setStyleSheet("background-color: green;")
label2.move(100, 100)


# label2.lower()
# label1.raise_()

# label2.stackUnder(label1)

# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

点击哪个标签,哪个标签显示到最上面
点击红色标签
在这里插入图片描述

点击绿色标签
在这里插入图片描述

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

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

相关文章

变位齿轮的齿高好像不变

通过这个软件的计算,变位尺寸的大小径都会同时变化,从而整个齿高好像没有变化。 下面百度答案

中国AI已遥遥领先

关注卢松松,会经常给你分享一些我的经验和观点。 种种迹象表明,中国的AI产业是仅次于美国的存在,中国的AI已经遥遥领先,其他国家。 根据中国信息通信研究院发布的报告称: 根据中国信息通信研究院近日发布的《全球…

LabVIEW远程实验数据采集系统

随着科学研究的不断发展,实验室对远程数据采集和监控的需求越来越高。传统的数据采集方式往往需要实验人员亲临现场,费时费力,且数据实时性较差。为了解决这些问题,基于LabVIEW开发了一套远程实验数据采集系统,实现对实…

网络建设与运维23国赛网络运维正式赛题解析

竞赛环境请看主页! 23国赛网络运维 任务描述:某集团公司在更新设备后,路由之间无法正常通信,请修 复网络达到正常通信。 (1) 请在server1“管理员”下拉菜单中选择“镜像”选项卡,点 击 “创…

就业平台小程序的设计

管理员账户功能包括:系统首页,个人中心,学生管理,企业管理,企业类型管理,留言板管理,系统管理 微信端账号功能包括:系统首页,招聘信息,简历,我的…

centos安装数据库同步工具sqoop并导入数据,导出数据,添加定时任务

目录 1.安装jdk 1.1上传jdk安装包到/opt目录下并解压 1.2解压 1.3配置环境变量 2.安装hadoop 2.1.下载hadoop 2.2.解压hadoop 2.3配置环境变量 3.安装sqoop 3.1下载 3.2解压 3.3下载依赖包并复制到指定位置 3.3.1下载commons-lang-2.6-bin.tar.gz 3.3.2将mysql-c…

2024Q2全球PC市场:联想增3.7%、苹果增20.8%

7月9日,IDC发布最新PC市场报告,称2024年第2季度全球PC出货量 6490 万台,同比增长3.0%,尽管整体市场得益于与2023年较低数据的有利比较,但中国的PC市场仍处于疲软态势。除中国外,全球出货量同比增长超过5%。…

ubuntu部署minio集群

minio集群介绍 官方文档:https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html 本方案采用在多节点多驱动器 (MNMD) 或“分布式”配置部署 MinIO。 MNMD 部署提供企业级性能、可用​​性和可扩展性&#…

【每日一练】python面对对象的基本概念和用法(附实例)

面向对象编程(OOP)是一种程序设计方法,其基本概念包括对象、类、继承和封装。 对象:对象是系统中的基本单位,用于描述客观事物。每个对象包含一组属性和对这些属性进行操作的方法。对象是类的一个实例,具有…

10-《木棉》

木 棉 木棉又名红棉、英雄树、攀枝花、斑芝棉、斑芝树、攀枝,属木棉科,落叶大乔木,原产印度。木棉是一种在热带及亚热带地区生长的落叶大乔木,高10-25米。树干基部密生瘤刺,以防止动物的侵入。木棉外观多变…

Dart笔记:Isolate及其通信机制

Dart笔记 多隔离及其通信机制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/a…

【合并两个有序数组】

合并两个有序数组 一、题目二、普通解法三、双指针 一、题目 二、普通解法 先合并后排序 补充:js合并数组方法详见https://blog.csdn.net/ACCPluzhiqi/article/details/131702269?fromshareblogdetail js排序方法见http://t.csdnimg.cn/wVCOP 时间复杂度:O(mn)…

【DevOps】在云原生时代的角色与重要性探索

🐇明明跟你说过:个人主页 🏅个人专栏:《未来已来:云原生之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是云原生 2、云原生的核心特性 3、什么是DevOps…

c++获取用户的输入并格式化

一行单个数据 string str; cin>>str;一行固定多个且空格隔开 int n, m; cin >> n >> m;在输入时&#xff0c;会自动做格式装换。 一行不固定多个且空格隔开 #include <sstream> #include <string>string str; getline(cin, str); stringstr…

FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流

SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架&#xff0c;可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等&#xff0c;支持的音频编码包括AAC、OPUS等等&#xff0c;可谓功能强大的APP直播框架。 相比之下&#xff0c;另一款APP直播框架RT…

【系统架构设计师】九、软件工程(软件开发生命周期|McCabe度量法|系统转换|系统维护|净室软件工程|基于构件的软件工程)

目录 九、软件开发生命周期和工具 十、McCabe度量法 十一、系统转换 11.1 遗留系统 11.2 系统转换 11.3 系统维护 十二、净室软件工程 十三、基于构件的软件工程 13.1 构件特征 13.2 构件模型要素 13.3 CBSE过程 13.4 构件组装 相关推荐 历年真题练习 九、软件开…

Django项目创建的基本准备工作【4】

【 一 】软件开发模式 官话下面 人话 瀑布开发就是将什东西都定义好了在进行开发对吧 敏捷就是进行模块化一样 分批进行 规定一个时间段完成什么样的功能。 总结来说&#xff0c;瀑布开发强调在项目开始之前进行详细的计划和准备&#xff0c;并按照预定的顺序逐步进行&#x…

Elasticseach学习

概念 是一个开源的分布式搜索引擎&#xff0c;可以应用于搜索、日志监控等 倒排索引 正向索引&#xff1a;基于文档id创建索引。查询词条时必须先找到文档&#xff0c;而后判断是否包含词条 倒排索引&#xff1a;对文档内容分词&#xff0c;对词条创建索引&#xff0c;并记录…

前端面试题44(JavaScript几种排序的变种或高级应用)

1. 快速排序的变种 三轴快排 (Three-Way QuickSort)&#xff1a;处理大量重复元素时更为高效&#xff0c;通过维护三个区域来避免重复元素的重复比较和交换。平衡快排 (Balanced QuickSort)&#xff1a;通过随机选取或使用中位数作为枢轴&#xff0c;以减少最坏情况下的性能退…

重命名文件的方法有哪些?重命名文件的工具有哪些?

在日常的计算机使用过程中&#xff0c;重命名文件是一项常见但至关重要的任务。无论是为了更好地组织文件、修复命名错误&#xff0c;还是简化文件管理流程&#xff0c;掌握正确的重命名方法和工具都能显著提升效率。 本文将探讨多种重命名文件的方法&#xff0c;同时介绍几款高…