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

【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_())

运行
在这里插入图片描述

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

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

相关文章:

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

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

流程图编辑框架LogicFlow-vue-ts和js

LogicFlow官网https://site.logic-flow.cn/LogicFlow 是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端研发自定义开发各种逻辑编排场景,如流程图、ER图、BPMN流程等。在工作审批配…...

goaccess分析json格式日志

一.安装使用yum安装,yum install goaccess 二.主要介绍格式问题 1.nginx日志格式如下: log_format main escapejson {"time_local":"$time_local", "remote_addr":"$remote_addr", "r…...

游戏AI的创造思路-技术基础-决策树(1)

决策树,是每个游戏人必须要掌握的游戏AI构建技术,难度小,速度快,结果直观,本篇将对决策树进行小小解读~~~~ 目录 1. 定义 2. 发展历史 3. 决策树的算法公式和函数 3.1. 信息增益(Information Gain&…...

OPenCV实现直方图均衡化----20240711

# 直方图均衡化import cv2 import numpy as np import matplotlib.pyplot as plt# 读取彩色图像 img = cv2.imread("./pictures/Lena.jpg")# 检查图像是否加载成功 if img is None:print("Could not open or find the i...

2023年全国大学生电子信息竞赛E题——自动追踪系统(stm32和openmv+普通舵机)完美解决第四问

当时做的时候,当时看别人开源的23年的题,感觉一头雾水。两个字没思路。确实只有做了才会有思路。我这里清晰的整理出来思路。 1.第一问的复位问题就是写一个函数,如果按键按下,就进入,再按下就退出 当然这个复位是写死…...

【UNI-APP】阿里NLS一句话听写typescript模块

阿里提供的demo代码都是javascript,自己捏个轮子。参考着自己写了一个阿里巴巴一句话听写Nls的typescript模块。VUE3的组合式API形式 startClient:开始听写,注意下一步要尽快开启识别和传数据,否则6秒后会关闭 startRecognition…...

Apache Spark分布式计算框架架构介绍

目录 一、概述 二、Apache Spark架构组件栈 2.1 概述 2.2 架构图 2.3 架构分层组件说明 2.3.1 支持数据源 2.3.2 调度运行模式 2.3.3 Spark Core核心 2.3.3.1 基础设施 2.3.3.2 存储系统 2.3.3.3 调度系统 2.3.3.4 计算引擎 2.3.4 生态组件 2.3.4.1 Spark SQL 2.…...

Visual Studio 2019 (VS2019) 中使用 CMake 配置 OpenCV 库(快捷版)

2024.07.11 测试有效 最近需要用一下 opencv 处理图像,简单配置了一下Cmake下的 opencv 库。 没有编译 opencv ,也不知道他们为什么要自己编译 opencv 。 一、下载并安装 OpenCV 1.前往 OpenCV 官方网站 下载适用于您的系统的 OpenCV 安装包。 2.点击直接…...

BUG解决:postman可以请求成功,但Python requests请求报403

目录 问题背景 问题定位 问题解决 问题背景 使用Python的requests库对接物联数据的接口之前一直正常运行,昨天突然请求不通了,通过进一步验证发现凡是使用代码调用接口就不通,而使用postman就能调通,请求参数啥的都没变。 接口…...

VScode常用快捷键

VScode介绍 VSCode(全称:Visual Studio Code)是一款由微软开发且跨平台的免费源代码编辑器。能够在windows、Linux、IOS等平台上运行,通过安装一些插件可以让这个编辑器变成一个编译器。与Visual Studio相比,它是免费…...

Day1每日编程题日记:数字统计、两个数组的交集、点击消除

前言:该篇用于记录自看。曾回看昨天的做题代码,竟然会觉得陌生,这竟然是我写的,细细读了一下,原来我当时是这么想的。因此我觉得记代码没有实际用处,重点是领悟了思想,这样子代码就在心中&#…...

ENSP实现防火墙区域策略与用户管理

目录 实验拓扑与要求​编辑 交换机与防火墙接口的配置 交换机: 创建vlan 接口配置 防火墙配置及接口配置 防火墙IP地址配置 云配置​编辑​编辑​编辑 在浏览器上使用https协议登陆防火墙,并操作 访问网址:https://192.168.100.1:844…...

c#实现23种常见的设计模式--动态更新

c#实现23种常见的设计模式 设计模式通常分为三个主要类别: 创建型模式 结构型模式 行为型模式。 这些模式是用于解决常见的对象导向设计问题的最佳实践。 以下是23种常见的设计模式并且提供c#代码案例: 创建型模式: 1. 单例模式&#…...

昇思25天训练营Day11 - 基于 MindSpore 实现 BERT 对话情绪识别

模型简介 BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末开发并发布的一种新型语言模型。与BERT模型相似的预训练语言模型例如问答、命名实体识别、自然语言推理、…...

本地开发微信小程序,使用巴比达内网穿透

在微信小程序开发的热潮中,开发者常面临的一个挑战是如何在复杂的网络环境下测试和调试内网环境中的服务。巴比达正为这一难题提供了一条解决方案,极大简化了微信小程序与内网服务器之间通信的流程,加速了开发迭代周期。 以往,开…...

【LeetCode】快乐数

目录 一、题目二、解法完整代码 一、题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变…...

大模型未来发展深度分析

大模型未来发展方向的深度探讨 近年来,人工智能技术的飞速发展,特别是大模型技术的崛起,为全球科技产业带来了前所未有的变革。大模型,以其强大的推理能力、创意生成能力和情绪智能,正在逐步成为推动社会经济发展的核…...

[线性RNN系列] Mamba: S4史诗级升级

前言 iclr24终于可以在openreview上看预印本了 这篇(可能是颠覆之作)文风一眼c re组出品;效果实在太惊艳了,实验相当完善,忍不住写一篇解读分享分享。 TL;DR (overview) Structured State-Sp…...

【鸿蒙学习笔记】元服务

官方文档:元服务规格 目录标题 什么是元服务特征第一个元服务-案例介绍创建项目源码启动模拟器启动entry创建卡片出发元服务 什么是元服务 特征 免安装分包预加载老化和更新机制 第一个元服务-案例介绍 创建项目 源码 Entry Component struct WidgetCard {buil…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​:Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的&#xff…...

基于 HTTP 的单向流式通信协议SSE详解

SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...

年度峰会上,抖音依靠人工智能和搜索功能吸引广告主

上周早些时候举行的第五届年度TikTok World产品峰会上,TikTok推出了一系列旨在增强该应用对广告主吸引力的功能。 新产品列表的首位是TikTok Market Scope,这是一个全新的分析平台,为广告主提供整个考虑漏斗的全面视图,使他们能够…...