当前位置: 首页 > 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…...

LIS+找规律,CF 582B - Once Again...

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 582B - Once Again... 二、解题报告 1、思路分析 考虑朴素做法对T *n的数组求LIS 但是T * n可达1e9 思考一下,最优解无非就是几个循环节拼接,我们最差情况下对sqrt(T)个a[]求LIS即…...

数据赋能(145)——开发:数据拆分——实施过程、应用特点

实施过程 数据拆分的实施过程通常涉及以下几个关键步骤: 确定拆分目标和需求: 明确数据拆分的目的和需求,例如是为了减少数据处理的复杂性、提高查询效率还是为了满足特定的业务需求。根据需求确定拆分后的数据结构和拆分规则。选择拆分方法…...

【漏洞复现】Splunk Enterprise for Windows 任意文件读取漏洞 CVE-2024-36991

声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。 一、漏洞描述 Splunk Enterprise 是一款强大的机器数据管理和分析平台,广泛应用于企业中,用于实…...

FastAPI -- 第一弹

Hello World 经典的 Hello World 安装 pip install fastapi pip install "uvicorn[standard]"main.py from typing import Unionfrom fastapi import FastAPIapp FastAPI()app.get("/") def read_root():return {"Hello": "World"}…...

C++入门基础篇(1)

欢迎大家来到海盗猫鸥的博客—— 断更许久,让我们继续好好学习吧! 目录 1.namespace命名空间 命名空间的存在价值: 命名空间的定义: 命名空间的使用: 2.C输入输出函数 使用: 3.缺省参数 4.函数重载…...

基于html开发的在线网址导航在线工具箱源码

基于html开发的在线网址导航在线工具箱源码,将全部文件复制到服务器,入口文件是index.html 如需修改网址,可修改index.html 如需修改关于页面,可修改about里面的index页面 源码下载:https://download.csdn.net/down…...

【密码学】大整数分解问题和离散对数问题

公钥密码体制的主要思想是通过一种非对称性,即正向计算简单,逆向计算复杂的加密算法设计,来解决安全通信。本文介绍两种在密码学领域内最为人所熟知、应用最为广泛的数学难题——大整数分解问题与离散对数问题 一、大整数分解问题 &#xf…...

解析 pdfminer layout.py LAParams类及其应用实例

解析 pdfminer layout.py LAParams类及其应用实例 引言类的定义1. line_overlap2. char_margin3. word_margin4. line_margin5. boxes_flow6. detect_vertical7. all_texts 类的初始化参数验证类的表示总结 引言 在这篇文章中,我们将解析一个叫做 LAParams 的类。这…...

Redis官方可视化管理工具

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl RedisInsight是一个Redis可视化工具,提供设计、开发和优化 Redis 应用程序的功能。RedisInsight分为免费的社区版和一个付费的企业版,免费版具有基本…...

android 固定图片大小

在Android中,固定图片大小可以通过多种方法实现,这些方法主要涉及到ImageView控件的使用、Bitmap类的操作,以及第三方库(如Glide)的辅助。以下是几种常见的方法: 1. 使用ImageView控件 在Android的布局文…...