找回密码
 会员注册
查看: 31|回复: 0

pythonPyQt5顶层窗口相关操作API原理剖析,企业级应用实战分享

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
69864
发表于 2024-9-5 11:17:39 | 显示全部楼层 |阅读模式
✨✨欢迎大家来到景天科技苑✨✨🎈🎈养成好习惯,先赞后看哦~🎈🎈🏆作者简介:景天科技苑🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战景天的主页:景天科技苑文章目录顶层窗口1.主窗口与顶层窗口的区别2.顶层窗口API详解与实战(1)设置窗口图标(2)设置窗口(3)设置窗口不透明度(4)窗口状态(5)窗口最大化与最小化(6)窗口标志(7)顶层窗口综合案例实战顶层窗口顶层窗口——就是当前响应的窗口,非顶层窗口就是灰色的,不响应的窗口。当一个窗口没有父对象,该窗口就是顶层窗口,有关顶层窗口的相关操作也是我们开发过程中经常遇到的,今天我们就有关顶层窗口的操作详细展开说说。1.主窗口与顶层窗口的区别主窗口永远只有1个;非主窗口可有多个;顶层窗口也只有1个;但他们是不是顶层窗口得看当前执行的窗口是否在最上面(所有窗口的上面)。就是主窗口的建立代表应用程序的开始;主窗口的关闭代表应用程序的结束。而顶层窗口只是显示在最上面,覆盖其他窗口,但却没有其他窗口能够挡住它!首先,一个应用程序可以有许多窗口,但主窗口只有一个!而顶层窗口其实也只有一个,但却可以是不同名字的窗口。举个例子:我创建了3个窗口:窗口1、2和3。其中,窗口1是主窗口。是这个应用程序的根本。当我运行该程序时,窗口1立即出现,此时,它就是顶层窗口;在运行程序期间,我利用某些方法(例如点击鼠标或按键盘)可以打开第二个窗口,此时,主窗口仍然是窗口1,而顶层窗口却改为窗口2了。我又打开了一个窗口,此时,主窗口仍然是窗口1,而顶层窗口又变成窗口3了,窗口2什么也不是。当我关闭窗口3时,窗口2成为顶层窗口(当然我们可以用一定的方法不这么做),窗口1还是主窗口。当我关闭窗口2时,窗口1成为顶层窗口,同时也是主窗口。但是,如果我没有关闭窗口2和3,而是立即关闭窗口1(如果可以的话,但一般我们都阻止用户这么做,必须让他们先关掉其他窗口再关主窗口!),那么程序就会停止。另外两个窗口也会随即关闭。一般应用程序都是这么设计的。简言之,就是主窗口的建立代表应用程序的开始;主窗口的关闭代表应用程序的结束。而顶层窗口只是显示在最上面,覆盖其他窗口,但却没有其他窗口能够挡住它!2.顶层窗口API详解与实战(1)设置窗口图标setWindowIconsetWindowIcon是QWidget(以及它的子类)的一个方法,用于设置窗口的图标。这个图标通常显示在窗口的左上角,以及当窗口最小化时显示在任务栏中。使用方法如下:QIcon可以传参类型setWindowIcon(QIcon("resource/header_icon.png"))1设置窗口图标代码实战#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的window.setWindowTitle("设置窗口图标")#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的栏window.resize(500,500)#创建图标对象,参数是图片icon=QIcon("../imgs/python-gui.png")#设置图标window.setWindowIcon(icon)#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233运行,查看窗口图标已变成我们设置的图片样式(2)设置窗口这个之前我们多次使用了,略(3)设置窗口不透明度在PyQt5中,如果我们希望将窗体设置为透明,并保持其中的某些控件不透明,我们可以通过设置窗体的样式表和控件的样式表来实现。我们可以使用setOpacity()函数来设置QWidget控件的不透明度。此函数将控件背景设置为一种半透明颜色,其不透明度由参数值指定。setWindowOpacity(float)#参数从1.0到0.0从不透明到透明windowOpacity()获取不透明度的值设置窗口不透明度代码实战#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的window.setWindowTitle("窗口透明度")#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的栏window.resize(500,500)#设置窗口不透明度#1是最不透明window.setWindowOpacity(1)#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233最不透明,值为10完全透明,啥也看不见了其他值都介于完全透明和不透明之间获取透明度值#获取不透明度值print(window.windowOpacity())12(4)窗口状态PyQt5中,设置窗口状态的方法和相关函数。窗口的显示状态即最大化,最小化,全屏,无状态,活动窗口等形式。设置窗口状态#设置窗口无状态,默认就是该状态#window.setWindowState(Qt.WindowNoState)12设置窗口最小化#设置窗口最小化相当于点击窗口最小化按钮,程序隐藏到任务栏window.setWindowState(Qt.WindowMinimized)12设置窗口最大化#设置窗口最大化相当于点击窗口最大化按钮,程序最大化占满整个屏幕window.setWindowState(Qt.WindowMaximized)12设置窗口全屏#设置窗口全屏,栏都看不到了window.setWindowState(Qt.WindowFullScreen)12设置活跃窗口#设置活动窗口当桌面有多个窗口,能操作的窗口称之为活动窗口window.setWindowState(Qt.WindowActive)12默认情况下,是谁后展示,谁显示到前面我们,也可以通过setWindowState(Qt.WindowActive)来人为控制哪个窗口时活跃窗口window.show()window2=QWidget()window2.setWindowTitle(“第二个窗口”)window2.show()#设置活动窗口当桌面有多个窗口,能操作的窗口称之为活动窗口,在每个窗口show之后设置window.setWindowState(Qt.WindowActive)获取窗口状态可以判断窗口处于什么状态#获取窗口状态print(window.windowState()==Qt.WindowNoState)12(5)窗口最大化与最小化上面通过窗口状态设置窗口最大化与最小化之等方式一般不是直接用,常常用于我们关闭了窗口自带的栏,自己创建一些按钮来实现最大化最小化的操作自带的窗口栏最大化最小化操作,一般是通过如下一些API可以设置或者判断#将窗口最大化显示#window.showMaximized()#将窗口最小化展示#window.showMinimized()#将窗口正常展示#window.showNormal()#将窗口全屏化展示window.showFullScreen()1234567891011(6)窗口标志窗口标志的主要作用就是为了设置整个窗口的外观设置窗口标志的方法我们可以通过以下方法来设置窗口标志:创建对象时候,直接设置flags的值通过函数setWindowFlags()设置setWindowFlags()根据传参不同,设置的窗口外观不同窗口样式参数顶层窗口外观标志无边框窗口代码实战#0.导入需要的包和模块fromPyQt5.Qtimport*#主要包含了我们常用的一些类,汇总到了一块importsys#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件window=QWidget()#2.2设置控件#设置窗口,默认是python,只有顶级控件才可以设置栏的window.setWindowTitle("窗口标志")#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的栏window.resize(500,500)#设置窗口标志#设置窗口无边框,这样窗口就没有栏了window.setWindowFlags(Qt.FramelessWindowHint)#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233此时的窗口就全死用户区域,不再有栏(7)顶层窗口综合案例实战创建一个窗口要求:无边框,无栏窗口半透明自定义最小化,最大化,关闭按钮支持拖拽用户区移动窗口代码#0.导入需要的包和模块fromPyQt5.Qtimport*importsysclassWindow(QWidget):def__init__(self,*args,**kwargs):super().__init__(*args,**kwargs)self.setWindowFlags(Qt.FramelessWindowHint)self.setWindowOpacity(0.9)#2.2设置控件self.setWindowTitle("顶层窗口操作-案例")self.resize(500,500)#鼠标按下标志位self.move_flag=False#公共数据self.top_margin=10self.btn_w=80self.btn_h=30self.setup_ui()defsetup_ui(self):#添加三个子控件-窗口的右上角close_btn=QPushButton(self)self.close_btn=close_btnclose_btn.setText("关闭")close_btn.resize(self.btn_w,self.btn_h)max_btn=QPushButton(self)self.max_btn=max_btnmax_btn.setText("最大化")max_btn.resize(self.btn_w,self.btn_h)mini_btn=QPushButton(self)self.mini_btn=mini_btnmini_btn.setText("最小化")mini_btn.resize(self.btn_w,self.btn_h)#点击关闭按钮,将窗口关闭close_btn.pressed.connect(self.close)defmax_normal():ifself.isMaximized():self.showNormal()max_btn.setText("最大化")else:self.showMaximized()max_btn.setText("恢复")#构建信号与槽,点击最大化最小化,实现功能max_btn.pressed.connect(max_normal)mini_btn.pressed.connect(self.showMinimized)defresizeEvent(self,QResizeEvent):#计算自定义的按钮位置print("窗口大小发生了改变")#close_btn_w=btn_wwindow_w=self.width()close_btn_x=window_w-self.btn_wclose_btn_y=self.top_marginself.close_btn.move(close_btn_x,close_btn_y)max_btn_x=close_btn_x-self.btn_wmax_btn_y=self.top_marginself.max_btn.move(max_btn_x,max_btn_y)mini_btn_x=max_btn_x-self.btn_wmini_btn_y=self.top_marginself.mini_btn.move(mini_btn_x,mini_btn_y)defmousePressEvent(self,evt):#判定点击的是否是鼠标左键#在此处设计一个标记,用作判定是否需要移动#一个就是窗口的原始坐标#鼠标按下的点#只有鼠标左键被按下才执行ifevt.button()==Qt.LeftButton:self.move_flag=Trueprint("鼠标按下了")#确定鼠标按下时的坐标点self.mouse_x=evt.globalX()self.mouse_y=evt.globalY()print("鼠标初始坐标点",self.mouse_x,self.mouse_y)#窗口初始坐标self.origin_x=self.x()self.origin_y=self.y()defmouseMoveEvent(self,evt):#if窗口的移动标记==True:#根据鼠标按下的点计算移动向量#根据移动向量,和窗口的原始坐标=最新坐标#移动整个窗口的位置ifself.move_flag:print("鼠标移动了")#鼠标移动的实时位置,计算移动向量move_x=evt.globalX()-self.mouse_xmove_y=evt.globalY()-self.mouse_y#窗口最终要移动向量dest_x=self.origin_x+move_xdest_y=self.origin_y+move_y#设置窗口移动self.move(dest_x,dest_y)defmouseReleaseEvent(self,QMouseEvent):#把这个标记,进行重置Falseprint("鼠标松开了")#松开鼠标左键,恢复标志位为Falseself.move_flag=False#1.创建一个应用程序对象app=QApplication(sys.argv)#2.控件的操作#2.1创建控件,正常普通窗口可以通过如下方式设置无边框#window=QWidget(flags=Qt.FramelessWindowHint)window=Window()#2.3展示控件window.show()#3.应用程序的执行,进入到消息循环sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129运行点击最大化,最小化,关闭,功能都已实现在窗口按住鼠标左键,移动窗口也可以移动
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-7 05:48 , Processed in 0.805161 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表