简述
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 QRect
class Canvas(QWidget):
def __init__(self):
super().__init__()
self.__objs={}#{widget:[obj,...]}
def AddObject(self,obj,weight):
obj.setParent(self)
objs=self.__objs
objs.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.paintEvent
def newPaintEvent(event):
print(self.accessibleName())
oldPaintEvent(event)
return newPaintEvent
obj.paintEvent=Create_PaintEvent(obj)
return obj
cv=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