✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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)设置窗口图标
setWindowIcon
setWindowIcon 是 QWidget(以及它的子类)的一个方法,用于设置窗口的图标。这个图标通常显示在窗口的左上角,以及当窗口最小化时显示在任务栏中。
使用方法如下:
QIcon可以传参类型
setWindowIcon(QIcon("resource/header_icon.png"))
设置窗口图标代码实战
# 0. 导入需要的包和模块
from PyQt5.Qt import * # 主要包含了我们常用的一些类, 汇总到了一块
import sys# 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_())
运行,查看窗口图标已变成我们设置的图片样式
(2)设置窗口标题
这个之前我们多次使用了,略
(3)设置窗口不透明度
在PyQt5中,如果我们希望将窗体设置为透明,并保持其中的某些控件不透明,我们可以通过设置窗体的样式表和控件的样式表来实现。
我们可以使用setOpacity()函数来设置QWidget控件的不透明度。此函数将控件背景设置为一种半透明颜色,其不透明度由参数值指定。
setWindowOpacity(float) #参数从1.0 到0.0 从不透明到透明
windowOpacity() 获取不透明度的值
设置窗口不透明度代码实战
# 0. 导入需要的包和模块
from PyQt5.Qt import * # 主要包含了我们常用的一些类, 汇总到了一块
import sys# 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_())
最不透明,值为1
0完全透明,啥也看不见了
其他值都介于完全透明和不透明之间
获取透明度值
#获取不透明度值
print(window.windowOpacity())
(4)窗口状态
PyQt5中,设置窗口状态的方法和相关函数。窗口的显示状态即最大化,最小化,全屏,无状态,活动窗口等形式。
设置窗口状态
#设置窗口无状态,默认就是该状态
# window.setWindowState(Qt.WindowNoState)
设置窗口最小化
#设置窗口最小化 相当于点击窗口最小化按钮,程序隐藏到任务栏
window.setWindowState(Qt.WindowMinimized)
设置窗口最大化
#设置窗口最大化 相当于点击窗口最大化按钮,程序最大化占满整个屏幕
window.setWindowState(Qt.WindowMaximized)
设置窗口全屏
#设置窗口全屏,标题栏都看不到了
window.setWindowState(Qt.WindowFullScreen)
设置活跃窗口
#设置活动窗口 当桌面有多个窗口,能操作的窗口称之为活动窗口
window.setWindowState(Qt.WindowActive)
默认情况下,是谁后展示,谁显示到前面
我们,也可以通过setWindowState(Qt.WindowActive)来人为控制哪个窗口时活跃窗口
window.show()
window2 = QWidget()
window2.setWindowTitle(“第二个窗口”)
window2.show()
#设置活动窗口 当桌面有多个窗口,能操作的窗口称之为活动窗口,在每个窗口show之后设置
window.setWindowState(Qt.WindowActive)
获取窗口状态
可以判断窗口处于什么状态
#获取窗口状态
print(window.windowState() == Qt.WindowNoState)
(5)窗口最大化与最小化
上面通过窗口状态设置窗口最大化与最小化之等方式一般不是直接用,常常用于我们关闭了窗口自带的标题栏,自己创建一些按钮来实现最大化最小化的操作
自带的窗口标题栏最大化最小化操作,一般是通过如下一些API可以设置或者判断
#将窗口最大化显示
# window.showMaximized()#将窗口最小化展示
# window.showMinimized()#将窗口正常展示
# window.showNormal()#将窗口全屏化展示
window.showFullScreen()
(6)窗口标志
窗口标志的主要作用就是为了设置整个窗口的外观
设置窗口标志的方法
我们可以通过以下方法来设置窗口标志:
创建对象时候,直接设置flags的值
通过函数setWindowFlags()设置
setWindowFlags()根据传参不同,设置的窗口外观不同
窗口样式参数
顶层窗口外观标志
无边框窗口代码实战
# 0. 导入需要的包和模块
from PyQt5.Qt import * # 主要包含了我们常用的一些类, 汇总到了一块
import sys# 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_())
此时的窗口就全死用户区域,不再有标题栏
(7)顶层窗口综合案例实战
创建一个窗口
要求:
无边框,无标题栏
窗口半透明
自定义最小化,最大化,关闭按钮
支持拖拽用户区移动窗口
代码
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sysclass Window(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()def setup_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)def max_normal():if self.isMaximized():self.showNormal()max_btn.setText("最大化")else:self.showMaximized()max_btn.setText("恢复")#构建信号与槽,点击最大化最小化,实现功能max_btn.pressed.connect(max_normal)mini_btn.pressed.connect(self.showMinimized)def resizeEvent(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)def mousePressEvent(self, evt):# 判定点击的是否是鼠标左键# 在此处设计一个标记, 用作判定是否需要移动# 一个就是窗口的原始坐标# 鼠标按下的点#只有鼠标左键被按下才执行if evt.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()def mouseMoveEvent(self, evt):# if 窗口的移动标记 == True:# 根据鼠标按下的点 计算移动向量# 根据移动向量, 和窗口的原始坐标 = 最新坐标# 移动整个窗口的位置if self.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)def mouseReleaseEvent(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_())
运行
点击最大化,最小化,关闭,功能都已实现
在窗口按住鼠标左键,移动窗口也可以移动