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

news2024/9/25 11:12:07

在这里插入图片描述

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

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

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

class 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 = 10
        self.btn_w = 80
        self.btn_h = 30

        self.setup_ui()

    def setup_ui(self):

        # 添加三个子控件 - 窗口的右上角
        close_btn = QPushButton(self)
        self.close_btn = close_btn
        close_btn.setText("关闭")
        close_btn.resize(self.btn_w, self.btn_h)

        max_btn = QPushButton(self)
        self.max_btn = max_btn
        max_btn.setText("最大化")
        max_btn.resize(self.btn_w, self.btn_h)

        mini_btn = QPushButton(self)
        self.mini_btn = mini_btn
        mini_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_w
        window_w = self.width()
        close_btn_x = window_w - self.btn_w
        close_btn_y = self.top_margin
        self.close_btn.move(close_btn_x, close_btn_y)

        max_btn_x = close_btn_x - self.btn_w
        max_btn_y = self.top_margin
        self.max_btn.move(max_btn_x, max_btn_y)

        mini_btn_x = max_btn_x - self.btn_w
        mini_btn_y = self.top_margin
        self.mini_btn.move(mini_btn_x, mini_btn_y)

    def mousePressEvent(self, evt):
        # 判定点击的是否是鼠标左键
        # 在此处设计一个标记, 用作判定是否需要移动
        # 一个就是窗口的原始坐标
        # 鼠标按下的点
        #只有鼠标左键被按下才执行
        if evt.button() == Qt.LeftButton:
            self.move_flag =True
            print("鼠标按下了")
            #确定鼠标按下时的坐标点
            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_x
            move_y = evt.globalY() - self.mouse_y

            #窗口最终要移动向量
            dest_x = self.origin_x + move_x
            dest_y = self.origin_y + move_y

            #设置窗口移动
            self.move(dest_x,dest_y)

    def mouseReleaseEvent(self, QMouseEvent):
        # 把这个标记, 进行重置  False
        print("鼠标松开了")
        # 松开鼠标左键,恢复标志位为False
        self.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.coloradmin.cn/o/1920529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

VMware Workstation 虚拟机网络配置为与主机使用同一网络

要将 VMware Workstation 虚拟机网络配置为与主机使用同一网络,我们需要将虚拟机的网络适配器设置为桥接模式。具体步骤如下: 配置 VMware Workstation 虚拟机网络为桥接模式 打开 VMware Workstation: 启动 VMware Workstation。 选择虚拟机…

某企业数据治理总体解决方案(45页PPT)

引言:集团企业数据治理总体解决方案旨在构建一个高效、安全、合规且灵活的数据管理体系,以支持企业决策优化、业务创新、风险管理和运营效率提升。该方案通过整合数据资源、规范数据流程、强化数据质量和促进数据共享,实现数据资产的最大化价…

【文档】软件详细设计说明书(直接套用word)

软件详细设计说明书直接套用实际项目。 原件可获取。

Golang | Leetcode Golang题解之第230题二叉搜索树中第K小的元素

题目: 题解: type MyBst struct {root *TreeNodenodeNum map[*TreeNode]int // 统计以每个结点为根结点的子树的结点数,并存储在哈希表中 }// 统计以 node 为根结点的子树的结点数 func (t *MyBst) countNodeNum(node *TreeNode) int {if…

百度网盘资料使用

1. 将链接复制到浏览器打开,点击提取文件 2. 提取文件,进入如下界面 3. 因为文件太大,而且未开会员,所以无法全部转存到网盘,只能分批次转存 点击目录,进入文件夹 1)选择一个喜欢的文件&#…

【密码学】消息认证

可以用“信封印章”来类比消息认证的过程。假设你要给远方的朋友写一封信。为了确保信件的内容不被他人篡改或者冒充,你会采取一些措施来保证信件的真实性与完整性。 具体步骤如下: 撰写信件:你写下了一封信,内容是你和朋友约定的…

Java常用的三种注解

1、 基本注解 一、注解的概念 1、注解也叫元数据,是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。注解的形式是“单词”。 在不改变原有逻辑的情况下,使用注解在源…

《系统架构设计师教程(第2版)》第11章-未来信息综合技术-07-大数据技术概述

文章目录 1. 大数据的定义2. 大数据的研究内容2.1 面临的问题2.2 面临的挑战2.3 分析步骤2.3.1 数据获取和记录2.3.2 信息抽取和清洗2.3.3 数据集成、聚集和表示2.3.4 查询处理、数据建模和分析2.3.5 解释 3.大数据的应用领域3.1 制造业的应用3.2 服务业的应用3.3 交通行业的应…

Nifi中的Controller Service

Service简介 首先Nifi中的Controller Service 和我们MVC概念中的Controller Service不是一个概念,Nifi中的Controller Service更像是和Processor同级的一个概念,它和Processor在我个人的使用经验来理解的话就是它是预制好的各种服务,可以被P…

java入门1.5.0

前言: 在java入门1.4.0中,我们快速构建了一个基于Maven管理的Spring boot3项目,对基本文件结构有了初步的认知,创建了git仓库 正片: 看山是山,看山不是山,看山还是山,下面两段代码很好了验证这…

51单片机嵌入式开发:9、 STC89C52RC 操作LCD1602技巧

STC89C52RC 操作LCD1602技巧 1 代码工程2 LCD1602使用2.1 LCD1602字库2.2 巧妙使用sprintf2.3 光标显示2.4 写固定长度的字符2.5 所以引入固定长度写入方式: 3 LCD1602操作总结 1 代码工程 承接上文,在原有工程基础上,新建关于lcd1602的c和h…

逐步实践复现 SELF-RAG

SELF-RAG 简介 SELF-RAG(Self-Reflective Retrieval-Augmented Generation)是一种检索增强生成(RAG)的框架,它通过自我反思学习检索、生成和批判,以提高大型语言模型(LLM)的质量和真…

谷粒商城实战笔记-28-前端基础-技术栈简介

文章目录 一,学习目标1,VSCode的使用2,开发语言ES6的学习目标3,Node.js的学习目标4,Vue的学习目标5,Babel的学习目标6,webpack的学习目标 二,前后端技术栈的比较 本节的主要内容是介…

KEIL下载芯片包记录

第一步 第二步 第三步

oracle 23ai新的后台进程bgnn介绍

前言 昨天发文研究了哪些oracle 后台不能杀 具体文章如下链接 oracle哪些后台进程不能杀?-CSDN博客 其中23ai中新增了一个后台进程bgnn 但是在oracle 23ai database reference中并没有找到该后台进程 有点不甘心就开了个SR,找oracle 官方来看看这个后…

Go语言---定时器

定时器 Timer-只响应一次 Timer 是一个定时器,代表未来的一个单一事件,可以告诉 timer 要等待多长时间,它提供一个 channel,在将来的那个时间那个 channel 提供了一个时间值。 2s后,往timer.C写数据,有…

智慧教育解决方案PPT(44页)

1. 教育信息化1.0与2.0 教育信息化1.0注重全体教师和学生的教学与学习应用,以及数字校园建设。2.0则强调宽带网络、优质资源和网络学习空间的普及,提高信息化应用水平和师生信息素养,建立教育资源和管理公共服务平台,推动“互联网…

【系统架构设计师】九、软件工程(项目管理|进度管理|软件配置管理|软件质量管理|软件风险管理 )

目录 十四、项目管理 14.1 软件进度管理 14.1.1 工作分解结构 14.1.2 Gantt 图 和 PERT 图 14.1.3 关键路径法 14.1.4 浮动时间 14.2 软件配置管理 14.3 软件质量管理 14.4 软件风险管理 相关推荐 历年真题练习 十四、项目管理 软件项目管理的对象是软件工程项目。…

3.Softmax回归

回归和分类 回归估计一个连续值 分类预测一个离散类别 Softmax回归实际是一个分类问题 从回归到多类分类 对类别进行一位有效编码 y [ y 1 , y 2 , ⋯ , y n ] T y[y_1,y_2,\cdots,y_n]^T y[y1​,y2​,⋯,yn​]T,如果是第i类,则值为1,否则为0 使用…