当前位置: 首页 > news >正文

【PyQt】调整子控件的层级以调整绘制的先后顺序

简述

qt中貌似没有直接设置z序的函数,但对应的有其他调整z序的方法:
QWidget.raise_():置顶
QWidget.lower():置底
QWidget.stackUnder(wid):置于指定控件之下

其中关键函数是QWidget.stackUnder(wid),利用该函数可以轻松调整控件的先后顺序。



Python代码:

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QLabel,QLineEdit
from PyQt5.QtCore import QRectclass Canvas(QWidget):def __init__(self):super().__init__()self.__objs={}#{widget:[obj,...]}def AddObject(self,obj,weight):obj.setParent(self)objs=self.__objsobjs.setdefault(weight,[]).insert(0,obj)keys=sorted(objs)index=keys.index(weight)if(index==0):#顶级obj.raise_()else:#置后key_front=keys[index-1]obj_front=objs[key_front][-1]obj.stackUnder(obj_front)if __name__=='__main__':app = QApplication(sys.argv)def CreateObject(Type,color,name,LTWH):obj=Type()obj.setStyleSheet(f"background-color:{color}")obj.setAccessibleName(name)obj.setGeometry(QRect(*LTWH))def Create_PaintEvent(self):oldPaintEvent=self.paintEventdef newPaintEvent(event):print(self.accessibleName())oldPaintEvent(event)return newPaintEventobj.paintEvent=Create_PaintEvent(obj)return objcv=Canvas()cv.AddObject(CreateObject(QWidget,"rgba(255,0,0,128)",'R1',(100,100,150,150)),1)cv.AddObject(CreateObject(QLineEdit,"rgba(0,255,0,255)",'G2',(100,200,150,150)),2)cv.AddObject(CreateObject(QLabel,"rgba(0,0,255,128)",'B3',(200,150,150,150)),3)cv.show()sys.exit(app.exec())

运行结果:

运行结果

代码说明:

这份代码很简单,但还是稍微解释一下。
这里创建了一个Canvas(画布类),类中有个函数AddObject(obj,weight)用于向画布中添加控件,其中的weight为权重,以调整控件的先后顺序。额,然后就没有然后了,这个Canvas类已经可以投入使用了。

main代码段中的CreateObject仅仅是为了减少重复代码,对obj.paintEvent的重新赋值是为了更直观地看出绘制的先后顺序,越后绘制的就越显示在前面。R1对应的是红矩形(值最小,权重/优先级最高),B3则是蓝矩形(值最大,权重/优先级最低)


参考:

  • Qt窗口设置Z方向的层叠顺序:[CSDN]https://blog.csdn.net/null_plus/article/details/110198128
  • Qt中GUI分层管理:[知乎]https://zhuanlan.zhihu.com/p/136161261

未经本人同意不得私自转载。本文发布于CSDN:https://blog.csdn.net/weixin_44733774/article/details/134005001

http://www.lryc.cn/news/209786.html

相关文章:

  • js中数组的相关方法
  • 深入浅出排序算法之直接插入排序(拓展:折半插入排序)
  • 皮卡丘RCE靶场通关攻略
  • Mysql binlog日志功能使用,简单易懂
  • 计算机视觉-光源的目的和作用
  • 源码角度分析Java 循环中删除数据为什么会报异常
  • leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间
  • 5 个编写高效 Makefile 文件的最佳实践
  • 20231028刷题记录
  • 39 深度学习(三):tensorflow.data模块的使用(基础,可跳)
  • css四种导入方式
  • Linux学习第24天:Linux 阻塞和非阻塞 IO 实验(一): 挂起
  • 037-第三代软件开发-系统音量设置
  • Python 自动化详解(pyautogui)
  • 【Linux】第四站:Linux基本指令(三)
  • SpringBoot内置工具类之断言Assert的使用与部分解析
  • 如何检测租用的香港服务器是不是CN2线路呢?
  • Spring Boot进阶(94):从入门到精通:Spring Boot和Prometheus监控系统的完美结合
  • Redis(02)| 数据结构-SDS
  • HackTheBox-Starting Point--Tier 0---Preignition
  • 售货机相关的电路
  • 软考高项(十四)项目沟通管理 ★重点集萃★
  • Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第五章 高效的多线程日志
  • 利用Pholcus框架提取小红书数据的案例分析
  • 超详细Hadoop安装教程(单机版、伪分布式)
  • 持续集成部署-k8s-服务发现-Ingress
  • 从零开始搭建Prometheus+grafana服务器组件监控系统
  • 智能水厂运行与调控3D模拟仿真在线展示提高整个系统的协同效应
  • ts声明文件
  • JPA联合主键使用