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

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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_())

运行
在这里插入图片描述

点击最大化,最小化,关闭,功能都已实现
在这里插入图片描述

在窗口按住鼠标左键,移动窗口也可以移动
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++题解】1153 - 查找“支撑数”

问题:1153 - 查找“支撑数” 类型:数组基础 题目描述: 在已知一组整数中,有这样一种数非常怪,它们不在第一个,也不在最后一个,而且刚好都比左边和右边相邻的数大,你能找到它们吗&a…

《Windows API每日一练》9.2.1 菜单

■和菜单有关的概念 窗口的菜单栏紧挨着标题栏下面显示。这个菜单栏有时叫作程序的“主菜单”或“顶级菜单“(top-level menu)。顶级菜单中的菜单项通常会激活下拉菜单(drop-downmenu),也 叫“弹出菜单”(…

26.6 Django模型层

1. 模型层 1.1 模型层的作用 模型层(Model Layer)是MVC或MTV架构中的一个核心组成部分, 它主要负责定义和管理应用程序中的数据结构及其行为. 具体职责包括: * 1. 封装数据: 模型层封装了应用程序所需的所有数据, 这些数据以结构化的形式存在, 如数据库表, 对象等. * 2. 数据…

java中Error与Exception的区别

java中Error与Exception的区别 1、错误(Error)1.1 示例 2、 异常(Exception)2.1 示例 3、 区别总结 💖The Begin💖点点关注,收藏不迷路💖 当我们谈论编程中的错误(Error&…

STM32杂交版(HAL库、音乐盒、闹钟、点阵屏、温湿度)

一、设计描述 本设计精心构建了一个以STM32MP157A高性能单片机为核心控制单元的综合性嵌入式系统。该系统巧妙融合了蜂鸣器、数码管显示器、点阵屏、温湿度传感器、LED指示灯以及按键等多种外设模块,形成了一个功能丰富、操作便捷的杂交版智能设备。通过串口…

如何解决 PostgreSQL 中由于索引不当导致的性能下降问题?

文章目录 如何解决 PostgreSQL 中由于索引不当导致的性能下降问题一、常见的索引不当情况(一)缺失关键索引(二)过多的冗余索引(三)不合适的索引类型 二、如何发现索引不当的问题(一)…

docker-2

27.构建python应用镜像-dockerfile实践项目 1.基于官方的镜像,构建python代码运行环境 dockerfile 2.运行镜像,开启一个读写的容器空间(定制操作,将代码丢进去,运行调试) 3.提交这个变化的容器层数据&#…

生产英特尔CPU处理器繁忙的一天

早晨:准备与检查 7:00 AM - 起床与准备 工厂员工们早早起床,快速洗漱并享用早餐。为了在一天的工作中保持高效,他们会进行一些晨间锻炼,保持头脑清醒和身体活力。 8:00 AM - 到达工厂 员工们到达英特尔的半导体制造工厂&#…

数据库使用SSL加密连接

简介 数据库开通SSL加密连接是确保数据传输过程中安全性的关键措施,它通过加密数据、验证服务器身份、保护敏感信息、维护数据完整性和可靠性,同时满足行业标准和法规要求,进而提升用户体验和信任度,为企业的数据安全和业务连续性…

javaweb中的请求与响应--基于postman工具的应用(附带postman的详细安装步骤)

一、前言 后端的第一天感觉难度就上来了,可能是基础太过薄弱了吧。目前看视频已经有点跟不上了,果然15天想要拿下还是太勉强了点。30天还差不多。不知道读者们有没有好好的去学这方面的知识,没有什么是学不会的,关键是坚持。 Po…

Ubuntu22.04安装NIVIDIA显卡驱动总结

1.首先在安装驱动时需要判断系统有无GPU以及GPU的型号 可以参考这篇文章: https://blog.51cto.com/u_13171517/8814753#:~:textubuntu%20%E7%B3%BB%E7%BB%9F%20%E6%80%8E%E4%B9%88%E5%88%A4%E6%96%AD%E7%B3%BB%E7%BB%9F%E6%9C%89%E6%B2%A1%E6%9C%89GPU%201%20%E6%…

STM32实战篇:闪灯 × 流水灯 × 蜂鸣器

IO引脚初始化 即开展某项活动之前所做的准备工作,对于一个IO引脚来说,在使用它之前必须要做一些参数配置(例如:选择工作模式、速率)的工作(即IO引脚的初始化)。 IO引脚初始化流程 1、使能IO引…

乐观锁原理

乐观锁是一种并发控制的方法,主要用于多线程环境下,用于保证数据的一致性。其核心思想是:"在多个事务中乐观地读取数据,在提交时再验证是否有冲突,如果没有,则提交;如果有,则回…

每天五分钟深度学习:向量化技术在神经网络中的应用

本文重点 向量化技术,简而言之,就是利用矩阵运算(而非传统的for循环)来执行大规模的计算任务。这种技术依赖于单指令多数据(SIMD)架构,允许一个指令同时对多个数据元素执行相同的操作。例如,在向量化加法中,不再需要逐个元素进行加法操作,而是可以一次性对整个向量执…

Android使用AndServer在安卓设备上搭建服务端(Java)(Kotlin)两种写法

一直都是通过OkHttp远程服务端进行数据交互,突发奇想能不能也通过OkHttp在局域网的情况下对两个安卓设备或者手机进行数据交互呢? 这样一方安卓设备要当做服务端与另一个安卓设备通过OkHttp进行数据交互即可 当然还可以通过 socket 和 ServerSocket 通…

EasyExcel批量读取Excel文件数据导入到MySQL表中

1、EasyExcel简介 官网&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 2、代码实战 首先引入jar包 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</v…

PMP–知识卡片--项目管理五大过程组

记忆 五大“项目管理过程组”&#xff1a;启动&#xff0c;规划&#xff0c;执行&#xff0c;监控&#xff0c;收尾 五个领域&#xff0c;十个字&#xff0c;形象理解&#xff0c;理解逻辑&#xff1a;先启动→再规划→再执行→要监控→最后收尾 定义 经典项目管理场景将项目…

“闭门造车”之多模态思路浅谈:自回归学习与生成

©PaperWeekly 原创 作者 | 苏剑林 单位 | 科学空间 研究方向 | NLP、神经网络 这篇文章我们继续来闭门造车&#xff0c;分享一下笔者最近对多模态学习的一些新理解。 在前文《“闭门造车”之多模态思路浅谈&#xff1a;无损》中&#xff0c;我们强调了无损输入对于理想的…

mac生成.dmg压缩镜像文件

mac生成.dmg压缩镜像文件 背景准备内容步骤1&#xff0c;找一个文件夹2&#xff0c;制作application替身1&#xff0c;终端方式2&#xff0c;黄金右手方式 3&#xff0c;.app文件放入文件夹4&#xff0c;制作.dmg压缩镜像文件5&#xff0c;安装.dmg 总结 背景 为绕开App Store…

Go语言---并发编程之channel(双channel,单channel)以及应用实例(生产者消费者、打印机模型)

Channel goroutine 运行在相同的地址空间&#xff0c;因此访问共享内存必须做好同步。goroutine 通过通信来共享内存&#xff0c;而不是其享内存来通信。 引用类型 channel 是CSP 模式的具体实现,用于多个 goroutine 通讯。其内部实现了同步&#xff0c;确保并发安全。 chan…