【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

在这里插入图片描述

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

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

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战
景天的主页:景天科技苑

文章目录

  • PyQt5窗口交互
    • 1. 控件状态
    • 2. 控件可视化
    • 3.控件是否被编辑
    • 4.控件的关闭
    • 5.控件交互综合案例
    • 6.控件信息提示
    • 7.窗口焦点控制

PyQt5窗口交互

在PyQt5中,可以使用信号和槽来处理控件的交互状态。
常见API如下所示
在这里插入图片描述

1. 控件状态

控件状态表明了这个控件是否是可用的,比如一个按钮,通常使用灰色来表示为不可点击。在pyQt中,可以通过setEnabled()函数来设置控件的使能状态,以下代码绘制了一个无法被点击的按钮:

# 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)#创建个子控件
btn = QPushButton(window)
btn.setText("按钮")
btn.move(100,100)#设置信号与槽
btn.pressed.connect(lambda :print("按钮被点击了"))#查看按钮是否可用
print(btn.isEnabled())#设置按钮不可用
btn.setEnabled(False)#查看按钮是否可用
print("设置后",btn.isEnabled())# 2.3 展示控件
window.show()# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

运行,可见设置按钮不可用之前,按钮状态是可用的。设置之后,按钮是灰色的,不可点击
在这里插入图片描述

2. 控件可视化

在这里插入图片描述

只有窗口被绘制,才会被显示出来

可以通过setVisible()来设置一个控件是否可视,以下代码创建一个按键,但是设置为不可视:
setVisible()传递的参数值为True也不一定可见,主要还要看父控件的可见性
setHidden(bool) show() hide() 本质上还是调用了setVisible()方法

如下代码展示了,当调用了窗口对象show方法,就会触发绘制事件

# 0. 导入需要的包和模块
from PyQt5.Qt import *  # 主要包含了我们常用的一些类, 汇总到了一块
import sys# 1. 创建一个应用程序对象
app = QApplication(sys.argv)class Window(QWidget):#窗口绘制时,触发该事件def paintEvent(self, evt):print("窗口被绘制了")#重写了父类方法,由于我们不做绘制逻辑,让父类方法绘制,所以将父类绘制方法返回return super().paintEvent(evt)# 2. 控件的操作
# 2.1 创建控件
window = Window()# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setWindowTitle("控件可视化")
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
window.resize(500, 500)# 2.3 展示控件
window.show()# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

运行
在这里插入图片描述

当我们将show方法注释,绘制事件就不会被触发
在这里插入图片描述

此时,我们使用setVisible()方法,依然会触发绘制事件

#设置窗口可见
window.setVisible(True)

在这里插入图片描述

使用setHidden()方法设置窗口可见性

window.setHidden(False)

在这里插入图片描述

窗口绘制的时候,先绘制主窗口,再绘制子控件

# 0. 导入需要的包和模块
from PyQt5.Qt import *  # 主要包含了我们常用的一些类, 汇总到了一块
import sys# 1. 创建一个应用程序对象
app = QApplication(sys.argv)class Window(QWidget):#窗口绘制时,触发该事件def paintEvent(self, evt):print("窗口被绘制了")#重写了父类方法,由于我们不做绘制逻辑,让父类方法绘制,所以将父类绘制方法返回return super().paintEvent(evt)class Btn(QPushButton):def paintEvent(self, evt):print("按钮被绘制了")#重写了父类方法,由于我们不做绘制逻辑,让父类方法绘制,所以将父类绘制方法返回return super().paintEvent(evt)# 2. 控件的操作
# 2.1 创建控件
window = Window()# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setWindowTitle("控件可视化")
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
window.resize(500, 500)#创建按钮
btn = Btn(window)
btn.setText("按钮")# 2.3 展示控件
# window.show()#设置窗口可见
# window.setVisible(True)
window.setHidden(False)# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

运行可以看到,先绘主窗口,再绘制子控件 按钮
在这里插入图片描述

我们也可以设置当我们点击按钮时,隐藏按钮

btn.pressed.connect(lambda :btn.hide())

在这里插入图片描述

控制控件的显示和隐藏的本质是控制该控件是否被绘制

判定控件是否隐藏
在这里插入图片描述

isHidden() 判断控件是否设置了隐藏,如果没有设置隐藏,即使父控件不可见,该值获得的结果依然是 没有隐藏
在这里插入图片描述

isVisibleTo(widget)
如果能随着widget控件的显示和隐藏, 而同步变化, 则返回True
在这里插入图片描述

3.控件是否被编辑

在这里插入图片描述

代码展示:

# 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.setWindowModified(True)# 2.3 展示控件
window.show()# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

设置被编辑状态,标题栏显示个星星
在这里插入图片描述

当没有设置为编辑状态,不显示星星
在这里插入图片描述

判断窗口是否处于被编辑状态

#获取窗口是否处于被编辑状态
print(window.isWindowModified())

在这里插入图片描述

4.控件的关闭

具体API
window.close() #这种起始只是隐藏了按钮
setAttribute(Qt.WA_DeleteOnClose, True) #当设置了这个属性,设置按钮关闭时,就会释放按钮

只是关闭按钮,并不会触发destroyed事件
在这里插入图片描述

#设置属性
btn.setAttribute(Qt.WA_DeleteOnClose, True)

此时,关闭按钮,就会释放
在这里插入图片描述

5.控件交互综合案例

创建一个窗口, 包含一个文本框和一个按钮和一个标签
默认状态
标签隐藏
文本框和按钮显示
按钮设置为不可用状态

当文本框有内容时, 让按钮可用, 否则不可用
当文本框内容为jingtian时, 点击按钮则显示标签, 并展示文本为登录成功;否则为失败

代码展示

from PyQt5.Qt import *class Window(QWidget):def __init__(self):super().__init__()self.setWindowTitle("交互状态案例的学习")self.resize(500, 500)self.setup_ui()def setup_ui(self):# 添加三个子控件label = QLabel(self)label.setText("标签")label.move(100, 50)#默认让标签隐藏label.hide()#输入文本框le = QLineEdit(self)# le.setText("文本框")le.move(100, 100)btn = QPushButton(self)btn.setText("登录")btn.move(100, 150)btn.setEnabled(False)#参数值就是输入的内容def text_cao(text):print("文本内容发生了改变", text)# if len(text) > 0:#     btn.setEnabled(True)# else:#     btn.setEnabled(False)btn.setEnabled(len(text) > 0)#文件改变事件le.textChanged.connect(text_cao)def check():# print("按钮被点击了")# 1. 获取文本框内容content = le.text()# 2. 判定是否是jingtianif content == "jingtian":# 3. 是 -> 显示之前隐藏的提示标签, 展示文本label.setText("登录成功")else:label.setText("登录失败")#显示标签内容label.show()#设置标签尺寸自适应label.adjustSize()#点击登录按钮时触发btn.pressed.connect(check)if __name__ == '__main__':import sysapp = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_())

运行,当没有输入时,按钮是不可用状态
在这里插入图片描述

输入jigntian,点击登录,显示登录成功
在这里插入图片描述

输入其他内容,点击登录,显示登录失败
在这里插入图片描述

6.控件信息提示

一些控件当我们光标停留在上面的时候,会显示一个小框文本来提示。
提示大致分为三种,具体如下图所示
在这里插入图片描述

代码展示

# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys# 1. 创建一个应用程序对象
app = QApplication(sys.argv)# 2. 控件的操作
# 2.1 创建控件
# window = QWidget()
#创建主窗口,里面的子控件懒加载
window = QMainWindow()
# 懒加载
# 用到的时候, 才会创建
window.statusBar() #设置状态栏# 2.2 设置控件
window.setWindowTitle("信息提示")
window.resize(500, 500)#把窗口模式改成带问号的,窗口上下文帮助按钮
window.setWindowFlags(Qt.WindowContextHelpButtonHint)# 当鼠标停留在窗口控件身上之后, 在状态栏提示的一段文本
window.setStatusTip("这是窗口")#获取状态栏提示
print(window.statusTip())label = QLabel(window)
label.setText("社会我景天哥")
#鼠标放在标签上时,触发状态栏显示相关内容
label.setStatusTip("这是标签")#设置工具栏提示,鼠标放到标签上时,直接在旁边提示
label.setToolTip("这是一个提示标签")
#获取工具栏提示
print(label.toolTip())#设置工具栏提示时长
label.setToolTipDuration(2000)
print(label.toolTipDuration())#鼠标变成一个问号时,点击鼠标显示设置内容
label.setWhatsThis("这是啥? 这是标签")# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

当鼠标放在窗口上,状态栏显示
在这里插入图片描述

当鼠标放在标签上,状态栏和工具栏显示
在这里插入图片描述

当设置窗口模式,让鼠标变成问号,点击标签时显示
在这里插入图片描述

7.窗口焦点控制

当窗口中有多个控件时,鼠标焦点可能会聚焦到不同控件
焦点我们可以用鼠标点击,也可以按tab键切换
焦点在哪里,键盘输入就输入到哪里
只有获取焦点的控件,才能与用户交互
在这里插入图片描述

代码展示

# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys#继承,重写鼠标监听
class Window(QWidget):def mousePressEvent(self, evt):print("动态监听打印获取焦点的空间",self.focusWidget())#点击鼠标,焦点聚焦到下一个子控件# self.focusNextChild()#点击鼠标,焦点聚焦到上一个子控件# self.focusPreviousChild()#点击鼠标,焦点聚焦到下一个子控件 True是聚焦到下一个子控件,False是聚焦到上一个子控件# self.focusNextPrevChild(True)# 1. 创建一个应用程序对象
app = QApplication(sys.argv)# 2. 控件的操作
# 2.1 创建控件
window = Window()
# 2.2 设置控件
window.setWindowTitle("焦点控制")
window.resize(500, 500)le1 = QLineEdit(window)
le1.move(50, 50)le2 = QLineEdit(window)
le2.move(100, 100)le3 = QLineEdit(window)
le3.move(150, 150)#设置子控件,按下tab键获取焦点的顺序
#setTabOrder是静态方法,直接用类来调用
Window.setTabOrder(le1, le3)
Window.setTabOrder(le3, le2)#人为设置初始的焦点位置
# le2.setFocus()#设置获取焦点的方式
# le2.setFocusPolicy(Qt.TabFocus) #通过tab获取焦点
# le2.setFocusPolicy(Qt.ClickFocus) #通过鼠标点击获取焦点
# le2.setFocusPolicy(Qt.StrongFocus)  #可以通过鼠标和tab键获取焦点,默认是这种方式
# le2.setFocusPolicy(Qt.NoFocus)  #不能通过鼠标和tab键获取焦点,但可以通过setFocus仍可使其获得焦点# le2.setFocus()#取消焦点,这个一般配合setFocus()使用
# le2.clearFocus()# 2.3 展示控件
window.show()# print(le1)
# print(le2)
# print(le3)
#
# le2.setFocus()# 获取当前窗口内部, 所有子控件当中获取焦点的那个控件
#要获取到,必须通过设置哪个控件获取焦点,才能获取到,如果没有设置,获取到的是None
print("获取当前光标聚焦的子控件",window.focusWidget())# le1.clearFocus()# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

按tab切换光标焦点
在这里插入图片描述
当然,根据设置,点击鼠标也可以切换光标

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

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

相关文章

【ABB】示教器可编程按钮的配置

【ABB】示教器可编程按钮的配置 操作流程演示 操作流程 首先我要配置的是如图所示控制器上的四个按钮,这四个按钮是可以自定义功能的。 点击【菜单】点击【Control Panel】点击【ProgKeys】即可配置对应按键功能 演示 点击【菜单】 点击【配置可编程按键】 这里…

12306高铁票如何打印电子发票?

高铁票报销凭证电子版如何打印? 高铁票报销目前没有电子发票形式,只有纸质版报销凭证,不过虽然没有电子版报销凭证,但是可以通过多种方式获取纸质版报销凭证。 报销凭证只能打印一次,丢失不能补打,请妥善…

cpp 强制转换

一、static_cast static_cast 是 C 中的一个类型转换操作符,用于在类的层次结构中进行安全的向上转换(从派生类到基类)或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换(即从派生…

Stable Diffusion教程|视频转绘有手就会Ebsynth Utility应用详解

过去这几个月,相信很多同行都已经见识到了AIGC强大的风格化绘图能力,不仅能够做出高品质的美术资产,还可以将制作效率大幅提高,这也是AI概念如今在资本市场受热捧的重要原因。 不过,目前我们所见到的大部分图形&#…

把当前img作为到爷爷的背景图

(忽略图大小不一致,一般UI给的图会刚好适合页面大小,我这网上找的图,难调大小,我行内的就自己随便写的宽高),另外悄悄告诉你最后有简单方法~~ 先来看看初始DOM结构代码 …

支付宝低代码搭建电商小程序,无需编程,可视化操作

大家好,我是小悟 在数字化浪潮的推动下,为了更快速、高效地搭建电商小程序,支付宝低代码平台凭借其独特优势,为商家提供了便捷的解决方案。 支付宝低代码平台犹如一座精心打造的智慧工坊,让电商小程序的搭建变得轻而易…

硕博电子智能控制器、触摸显示屏在集装箱跨运车上的应用

港口跨运车,又称跨运车或轮胎式龙门吊(RTG),专门用于集装箱码头的装卸和搬运作业,能够迅速完成集装箱在码头前沿、堆场区域以及仓库之间的运输和堆垛,大幅度缩短了装卸周期,提高了港口物流周转效率。 现代跨运车往往配…

Linux - 冯-诺依曼体系结构、初始操作系统

目录 冯•诺依曼体系 结构推导 内存提高效率的方法 数据的流动过程 体系结构相关知识 初始操作系统 定位 设计目的 操作系统之上之下分别有什么 管理精髓:先描述,再组织 冯•诺依曼体系 结构推导 计算机基本工作流程图大致如下: 输入设备&a…

ServiceNow UI Jelly模板注入漏洞复现(CVE-2024-4879)

0x01 产品简介 ServiceNow 是一个业务转型平台。通过平台上的各个模块,ServiceNow 可用于从人力资源和员工管理到自动化工作流程或作为知识库等各种用途。 0x02 漏洞概述 由于ServiceNow的Jelly模板输入验证不严格,导致未经身份验证的远程攻击者可通过构造恶意请求利用,在…

高职软件技术实训室

一、高职软件技术实训室建设背景 随着“加快数字化发展,建设数字中国”这一战略目标的深入实施,软件技术作为数字经济的核心引擎,其战略地位愈发显著。在这一时代背景下,高职教育作为培养高素质、高技能人才的重要阵地&#xff0…

如何在Orcale首页定位到The Java® Virtual Machine Specification页面?

目标地址:https://docs.oracle.com/javase/specs/jls/se8/html/index.html 1. 在Orcale首页菜单栏中选择 Resources ⇒ Java Downloads 2. 往下滑,找到 Online Documentation 选项,点进去 3. 点击 Specifications 下的 Language VM 选项 5…

Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)

基础介绍 Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:网络地址转换(Network Address Translate)数据包内容修改以及数据包过滤的防火墙功能。Netfliter框架不仅仅在ipv4中有应用,bridge,ipv4&#…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(一)-3GPP TS 23.256 技术规范概述

3GPP TS 23.256 技术规范,主要定义了3GPP系统对无人机(UAV)的连接性、身份识别、跟踪及A2X(Aircraft-to-Everything)服务的支持。 3GPP TS 23.256 技术规范: 以下是文档的核心内容总结: UAV系…

在 PostgreSQL 里如何处理数据的归档和清理过程中的数据完整性验证?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何处理数据的归档和清理过程中的数据完整性验证 在 PostgreSQL 里如何处理数据的归…

数据驱动未来,Xinstall全渠道统计方案引领行业变革

在这个信息爆炸的时代,App市场的竞争日益激烈。对于每一个开发者或营销人员来说,掌握准确、全面的数据分析能力,是提升产品竞争力、优化营销策略的关键。然而,面对投放渠道的分散、数据打通的困难以及作弊流量的困扰,许…

RocketMQ源码学习笔记:消费者启动流程

这是本人学习的总结,主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、前置知识1.1、pull和push型消费者1.2、消息CommitLog到ConsumeQueue1.3、自动创建的重试主题1.4、广播型消费和集群型消费中offset的存储位置 2、消费中的启动流程2.1、Preview2.2、校验&…

《AIGC:智能创作时代》—开启智能创作的全新时代

在人工智能发展的漫长历程中,如何让机器学会创作一直被视为难以逾越的天堑。然而,人类的创造力终将赋予机器创造力,把世界送入智能创作的新时代。 书名:《AIGC:智能创作时代》,作者:杜雨、张孜铭…

150个pb网站模板(都是成品网站,上传php空间即可使用),建站必备

一网友提供的150个pb网站模板,其实就是成品网站,上传php空间即可使用,属于建站公司或者建站开发人员必备的资源。 一共150个基于pb的成品网站,基本上都可以找到适应你手头客户需要的一款,简单修改一下即可交活收钱了。…

【爬虫基础入门课件:第二课:爬虫入门】

爬虫入门 什么是爬虫? 不知道各位是否遇到过这样的需求. 就是我们总是希望能够保存互联网上的一些重要的数据信息为己所用. 比如, 在浏览到一些优秀的让人血脉喷张的图片时. 总想保存起来留为日后做桌面上的壁纸在浏览到一些重要的数据时(各行各业), 希望保留下来日后为自…

美式键盘 QWERTY 布局的起源

注:机翻,未校对。 The QWERTY Keyboard Is Tech’s Biggest Unsolved Mystery QWERTY 键盘是科技界最大的未解之谜 It’s on your computer keyboard and your smartphone screen: QWERTY, the first six letters of the top row of the standard keybo…