【PyQt学习篇 · ⑦】:QWidget - 父子关系扩充和层级控制

news2024/9/24 7:21:06

文章目录

  • 父子关系扩充
    • 常用API
    • 案例
  • 层级控制
    • 案例

父子关系扩充

常用API

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

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

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

以下为API的使用示例:

from PyQt5.QtWidgets import *
import sys

app = QApplication(sys.argv)

window = QWidget()
window.resize(500, 500)

# 创建三个标签

label = QLabel(window)
label.setText('标签1')
label.move(50, 50)

label2 = QLabel(window)
label2.setText('标签1')
label2.move(100, 100)

label3 = QLabel(window)
label3.setText('标签1')
label3.move(150, 150)

window.show()

print(window.childAt(55, 55))   # 获取55,55的位置的子QWidget
print(label2.parentWidget())    # 获取父Qwidget
print(window.childrenRect())    # 获取该QWidget中所有子QWidget的组合边界矩形


sys.exit(app.exec_())

运行结果:

在这里插入图片描述
在这里插入图片描述

案例

案例:创建窗口,包含若干个Label控件。

要求:

  • 点击哪个标签,就让哪个标签背景变红
  • 使用父控件处理,不要自定义QLabel子类

该案例的代码:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys

class Window(QWidget):
    def mousePressEvent(self, QMouseEvent):
        # 获取鼠标点击的位置,判断是否为QLabel标签
        if QMouseEvent.button() == Qt.LeftButton:
        	# QMouseEvent.x()和QMouseEvent.y()表示获取鼠标在局部控件中的位置
            sub_widget = self.childAt(QMouseEvent.x(), QMouseEvent.y())
            if (sub_widget is not None) and (sub_widget.inherits("QLabel")):
                sub_widget.setStyleSheet('background-color: red;')

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

    window = Window()
    # 创建三个标签
    for i in range(3):
        label = QLabel(window)
        label.setText(f'标签{i+1}')
        label.move(50*i, 50*i)

    window.resize(300, 300)
    window.show()

    sys.exit(app.exec_())

运行结果:
当点击标签1和标签3时,背景颜色变红。

在这里插入图片描述

层级控制

在PyQt中,QWidget的层级控制允许对不同的QWidget进行层级关系的调整,从而决定它们在屏幕上的显示顺序。以下是一些用于层级控制的常用API:

  1. lower() 函数可以将一个QWidget置于其兄弟QWidget的底部,即降低其显示级别。

  2. raise_() 函数可以将一个QWidget置于其兄弟QWidget的顶部,即提高其显示级别。

  3. a.stakUnder(b) 函数可以将QWidget a置于QWidget b的下方。

示例:
创建两个窗口,观察两个窗口的出现顺序

from PyQt5.QtWidgets import *
import sys

app = QApplication(sys.argv)

w1 = QWidget()
w1.resize(500, 500)
w1.setWindowTitle('w1')

w2 = QWidget()
w2.resize(300, 300)
w2.setWindowTitle('w2')

w1.show()
w2.show()

sys.exit(app.exec_())

运行结果:

在这里插入图片描述
通过运行结果我们看出:哪个控件后展示,它的级别就越高。在此例中w2窗口的级别比w1高。

  • 使用以上API将w2降低到底层
w1.show()
w2.show()

w2.lower()  # 将w2降低到底层
# 或
#w1.raise_()
# 或
#w2.stackUnder(w1)

运行结果:
w2降低到底层,被覆盖

在这里插入图片描述

案例

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

案例的代码:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys


class Window(QWidget):
    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.button() == Qt.LeftButton:
            sub_widget = self.childAt(QMouseEvent.x(), QMouseEvent.y())
            if (sub_widget is not None) and (sub_widget.inherits("QLabel")):
                sub_widget.raise_()     # 将鼠标点击的标签设置为顶层

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

    window = Window()
    window.resize(500, 500)

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

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

    window.show()
    sys.exit(app.exec_())

运行结果:

在这里插入图片描述

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

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

相关文章

k8s之pod

目录 一、Pod基础概念 1.1 在Kubrenetes集群中Pod有如下两种使用方式 1.2 pod的种类 二、容器的分类 (1)基础容器(pause) (2)初始化容器(initcontainers) (3&#…

数字经济之于城市碳排放:“加速器”抑或“减速带”?

数据简介:数字经济是我国经济高质量发展的核心驱动力,在提升碳福利绩效过程中发挥重要作用,其在许多方面都能提供减少碳排放的机会。通过数字化和物联网技术,能源系统、交通运输、城市规划等领域可以实现智能化管理和优化&#xf…

VPN与IP代理用哪个好?有何区别?

当谈到网络安全和IP变更时,人们会想到VPN和IP代理服务器。很多人很困惑,它们之间有什么区别,应该选择哪一个呢?这取决于您的需求来决定哪一个更好。 一、什么是VPN与IP代理? VPN 是虚拟专用网络 (Virtual Private Net…

软件测试进阶篇----接口测试

接口测试 一、接口的概述 接口是什么? 在系统与系统之间、子系统与子系统之间数据交互的功能就是接口。 接口就是一个特定功能的函数(方法),有参数,有返回值,调用者需要通过某种方式(网络协议&…

CVE-2021-21234 spring-boot-actuator-logview目录遍历漏洞

0x01 影响版本 Spring-Boot-Actuator-logview < 0.2.13 0x02 漏洞分析 源码中对filename进行了校验但并未对路径进行校验 校验函数如下&#xff1a; 0x03 漏洞复现 首先开vulhub的镜像 点击下载&#xff0c;原数据包如下 送入repeater打入payload&#xff0c;复现…

【机器学习】一、机器学习概述与模型的评估、选择

机器学习简介 由来 阿瑟.萨缪尔Arthur Samuel,1952年研制了一个具有自学习能力的西洋跳棋程序&#xff0c;1956年应约翰.麦卡锡John McCarthy&#xff08;人工智能之父&#xff09;之邀&#xff0c;在标志着人工智能学科诞生的达特茅斯会议上介绍这项工作。他发明了“机器学习…

视频增强修复软件Topaz Video AI mac中文版支持功能

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频&#xff0c;包括低分辨率视频、老旧影片、手机录制的视频等等。 使用Topaz Video AI非常简单&#xff…

一文搞懂隐私计算

隐私计算 1. 安全多方计算2. 联邦学习3. 可信执行环境4. 隐私计算三类技术比较 隐私计算&#xff08;Privacy computing&#xff09;是指在保证数据不对外泄露的前提下&#xff0c;由两个或多个参与方联合完成数据分析计算相关技术的统称。 隐私计算作为跨学科技术&#xff0c…

如何优雅地单元测试 Kotlin/Java 中的 private 方法?

翻译自 https://medium.com/mindorks/how-to-unit-test-private-methods-in-java-and-kotlin-d3cae49dccd ❓如何单元测试 Kotlin/Java 中的 private 方法❓ 首先&#xff0c;开发者应该测试代码里的 private 私有方法吗&#xff1f; 直接信任这些私有方法&#xff0c;测试到…

Leetcode—169.多数元素【简单】

2023每日刷题&#xff08;十四&#xff09; Leetcode—169.多数元素 算法思想 由于nums中一定存在多数元素&#xff0c;所以将nums数组元素递增排序&#xff0c;取出位置的元素即可 实现代码 class Solution { public:int majorityElement(vector<int>& nums) {s…

视频转gif表情怎么操作?一键提取gif动画

通过电影、电视剧等视频转换gif动画&#xff0c;效果非常的吸引人。但是很多视频转换gif的工具要么是需要下载要么就是操作起来很复杂。其实&#xff0c;大家只需要使用gif动画图片&#xff08;https://www.gif.cn/&#xff09;制作工具&#xff0c;不用下载任何软件&#xff0…

前端基础---跳转相关的功能

后端给链接地址并且给token进行跳转 如果点击有key4&#xff0c;说明要跳转到相应的页面 auth是通过后端获取的地址&#xff0c; jdk是后端获取的相应的token&#xff0c; 然后进行拼接&#xff0c;进行window.open&#xff08;&#xff09;进行跳转 if (key 4) {var testUrl …

JavaEE入门介绍,HTTP协议介绍,常用状态码及含义,服务器介绍(软件服务器、云服务器)

一、JavaEE入门 JavaEE&#xff08;Java Enterprise Edition&#xff09;&#xff0c;Java企业版&#xff0c;是一个用于企业级web开发&#xff08;不需要使用控制台&#xff09;平台。最早由Sun公司定制并发布&#xff0c;后由Oracle负责维护。 JavaEE平台规范了在开发企业级w…

开发者看亚马逊云科技1024【文末有福利~】

1024&#xff0c;2023年的1024&#xff0c;注定是不平凡的1024&#xff0c;AIGC已经成为了整个年度的主题&#xff0c;亚马逊云科技在这个开发者每年最重要的日子&#xff0c;举办了生成式AI构建者大会&#xff0c;让我们一起再次了解本次生成式AI构建者大会&#xff0c;回顾会…

【c++|opencv】一、基础操作---2.图像信息获取

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像信息获取&#xff0c;roi 1. 图像信息获取 // 获取图像信息#include <iostream> #include <opencv2/opencv.hpp>using namespace cv; …

浅谈智能卡远程费控电能表的设计与实现

叶根胜 安科瑞电气股份有限公司 上海嘉定201801 摘要:本文分析了国内外远程费用控制电能表的研究现状&#xff0c;并根据功能要求和参数要求设计研究了远程费用控制电能表。采用模块化设计的电能表硬件电路系统&#xff0c;并研究了电能表的功能程序软件&#xff0c;实现了测…

虚拟内存之页面置换算法

内存空间不够&#xff0c;OS将内存中暂时用不到的信息换出到外存。但页面的换入/出需要磁盘I/O&#xff0c;系统开销较大。页面置换算法要更少的缺页率。 一、最佳置换(OPT)-optimal 1.思想 每次选择淘汰以后永不使用、在最长时间内不再被访问的页面&#xff0c;以此保证最低的…

3 tensorflow构建模型详解

上一篇&#xff1a;2 用TensorFlow构建一个简单的神经网络-CSDN博客 1、神经网络概念 接上一篇&#xff0c;用tensorflow写了一个猜测西瓜价格的简单模型&#xff0c;理解代码前先了解下什么是神经网络。 下面是百度AI对神经网络的解释&#xff1a; 神经网络是一种运算模型&…

音视频技术开发周刊 | 317

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 MIT惊人再证大语言模型是世界模型&#xff01;LLM能分清真理和谎言&#xff0c;还能被人类洗脑 MIT等学者的「世界模型」第二弹来了&#xff01;这次&#xff0c;他们证明…

什么是Steam红锁?及红锁的原因

Steam红锁分为两种&#xff0c;一种是商业红&#xff0c;一种是欺诈红。 造成红锁的原因有哪些&#xff1f; 1.非正常玩家&#xff0c;大量囤货&#xff0c;就是你交易饰品的交易量太大了&#xff0c;而且频繁地买进同一个饰品&#xff0c;官方就会判定你是商业行为&#xff0…