【python】PyQt5事件传递,鼠标动作捕获,键盘按键捕获原理与应用实战

在这里插入图片描述

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

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

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

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

文章目录

  • 1.事件传递
    • (1)事件传递实战
  • 2.鼠标事件捕获案例
  • 3.键盘事件捕获案例
    • (1)键盘按键API使用方法
    • (2)键盘按键捕获案例实战
  • 4.总结

1.事件传递

控件消息的处理是从内到外的,即当前控件对传递来的消息无法处理时会交给它的父控件进行处理,如果父控件也无法处理就交给它的父控件的父控件处理,…,直到顶层控件也无法处理则结束。

当一个控件被触发了一个特定的行为时, 就会调用特定的方法, 来将事件传递给开发人员, 方便处理
重写这些事件方法, 就可以监听相关的信息
在父子控件之间,可以设置事件是否传递

如果一个控件没有处理该事件, 则会自动传递给父控件进行处理
事件对象具备两个特殊方法
accept() 自己处理了这个事件, 并告诉系统不要再向上层传递
ignore() 自己忽略了这个事件, 告诉系统, 继续往后传递去

(1)事件传递实战

# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sysclass Window(QWidget):def mousePressEvent(self, QMouseEvent):print("顶层窗口鼠标按下")#中间的窗口
class MidWindow(QWidget):def mousePressEvent(self, evt):print("中间控件被按下")#判断print('中间窗口事件是否被处理',evt.isAccepted())#ignore()表示标识事件未处理,继续向父窗口传播evt.ignore()class Label(QLabel):def mousePressEvent(self, evt):print("标签控件鼠标按下")#accept() 表示事件已处理,不需要向父窗口传播,此时,事件就不再向父控件传播# evt.accept()#查看事件是否被处理状态,默认情况下,当事件被传过来之后,就是被处理状态print('标签事件是否被处理',evt.isAccepted())# ignore()表示标识事件未处理,继续向父窗口传播evt.ignore()#此处在查看,事件是未处理状态,会继续向父窗口传播# print(evt.isAccepted())# 1. 创建一个应用程序对象
app = QApplication(sys.argv)# 2. 控件的操作
# 2.1 创建控件
window = Window()
# 2.2 设置控件
window.setWindowTitle("事件传递")
window.resize(500, 500)
window.setStyleSheet("background-color:green;")mid_window = MidWindow(window)
mid_window.resize(300, 300)
#默认设置的背景色不生效,需要设置下Qt.WA_StyledBackground
mid_window.setAttribute(Qt.WA_StyledBackground, True)
mid_window.setStyleSheet("background-color: yellow;")label = Label(mid_window)
# label = QLabel(mid_window)
label.setText("这是一个标签")
label.setStyleSheet("background-color: red;")
label.move(100, 100)btn = QPushButton(mid_window)
btn.setText("我是按钮")
btn.move(50, 50)# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

点击最中间的标签,当设置了ignore,层层向上传递
在这里插入图片描述

其他常用事件API介绍
在这里插入图片描述

2.鼠标事件捕获案例

创建一个窗口包含一个标签
鼠标进入标签时, 展示"欢迎光临"
鼠标离开标签时, 展示"谢谢惠顾"

from PyQt5.Qt import *#标签类
class Label(QLabel):#鼠标进入控件时触发def enterEvent(self, QEvent):self.setText("欢迎光临")self.adjustSize()#鼠标离开控件时触发def leaveEvent(self, QEvent):self.setText("谢谢惠顾")self.adjustSize()if __name__ == '__main__':import sysapp = QApplication(sys.argv)window = QWidget()window.resize(500,500)lable = Label(window)lable.move(100,100)lable.setStyleSheet("background-color: cyan;")window.show()sys.exit(app.exec_())

鼠标移入标签,显示欢迎光临
在这里插入图片描述

鼠标移出,显示谢谢惠顾
在这里插入图片描述

3.键盘事件捕获案例

PyQt5键盘事件被频繁处理。例如,按下F1,显示帮助信息;在文本编辑框中,按下回车键,输入焦点自动跳到另一控件。下面详细介绍键盘事件。

(1)键盘按键API使用方法

  • 修饰键
    Qt.NoModifier 没有修饰键
    Qt.ShiftModifier Shift键被按下
    Qt.ControlModifier Ctrl键被按下
    Qt.AltModifier Alt键被按下
    多个修饰键之间使用按位或运算

  • 普通键
    key后面字母大写
    Qt.Key_X

按下并释放键时,以下方法将被调用:
keyPressEvent(self,event) - 按下某一键时,该方法被调用直到键被释放为止;
keyReleaseEvent(self,event) - 释放之前按下的键时被调用。event参数为QKeyEvent对象,包括

事件的相关信息,有以下方法可调用。
key():返回按下键的值;
text():返回按下键的Unicode字符编码信息,当按键为Shift, Control, Alt等时,则该函数返回的字符为空值;
modifiers():判断按下了哪些修饰键(Shift,Ctrl , Alt,等等)。返回值为QtCore.Qt 类以下枚举变量的组合:
NoModifier - 没有修饰键;
ShiftModifier - 修饰键;
ControlModifier - 修饰键;
AltModifier - 修饰键;
MetaModifier - 修饰键;
KeypadModifier - 附加键盘上的任何按键;
GroupSwitchModifier - 按下键(仅限X11系统)。
isAutoRepeat(): 如果一直按着某键,返回True;否则,返回False;

键盘事件函数里面的传参对象有很多方法
在这里插入图片描述

其中modifiers方法用来获取修饰键
key用来获取普通键

(2)键盘按键捕获案例实战

监听用户输入Tab键
监听用户输入Ctrl+S组合键
监听用户输入Ctrl+Shift+S

from PyQt5.Qt import *#标签类
class Label(QLabel):#键盘事件# QKeyEventdef keyPressEvent(self, QKeyEvent):print("用户按键盘了")print("当前按下的普通键是",QKeyEvent.key())print("当前按下的修饰键是",QKeyEvent.modifiers())#QKeyEvent.modifiers()捕捉修饰键。QKeyEvent.key()捕获普通键if QKeyEvent.modifiers() == Qt.ControlModifier | Qt.ShiftModifier and QKeyEvent.key() == Qt.Key_S:print("用户按下了 Ctrl+Shit+S")if QKeyEvent.key() == Qt.Key_Tab:print("用户按下了tab键")if __name__ == '__main__':import sysapp = QApplication(sys.argv)window = QWidget()window.resize(500,500)label = Label(window)label.move(100,100)label.resize(200,200)label.setStyleSheet("background-color: cyan;")#需要设置键盘监听,确定是哪个控件监听键盘事件,不然触发不了键盘事件函数#捕获键盘,捕获鼠标,捕获手势等都有label.grabKeyboard()window.show()sys.exit(app.exec_())

运行,随便按个空格键
在这里插入图片描述

按下ctrl shift s
在这里插入图片描述

按下tab键
在这里插入图片描述

4.总结

能捕获到键盘和鼠标等设备的动作,就可以定制化实现各种我们需要的功能,比如点击后做什么,按下什么键执行什么操作,都可以开发出来,感兴趣的小伙伴赶紧尝试下吧。

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

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

相关文章

MiniGPT-Med 通用医学视觉大模型:生成医学报告 + 视觉问答 + 医学疾病识别

MiniGPT-Med 通用医学视觉大模型:生成医学报告 视觉问答 医学疾病识别 提出背景解法拆解 论文:https://arxiv.org/pdf/2407.04106 代码:https://github.com/Vision-CAIR/MiniGPT-Med 提出背景 近年来,人工智能(AI…

2-1静态库

静态库制作 编写库文件 test.c #include<stdio.h> int main(void){printf("%d\n",add(3,5));return 0; }add.c int add(int a,int b){return ab; }生成.o(目标文件) 用nm查看.o文件 T代表add这个函数的链接性是外部链接&#xff0c;即全局可见&#xff0c;…

AMSR-E L2 降雨子集:GES DISC 的 CloudSat 轨道 V002 (AMSERR_CPR) 位于同一地点

AMSR-E L2 Rainfall Subset, collocated with CloudSat track V002 (AMSERR_CPR) at GES DISC AMSR-E L2 降雨子集&#xff0c;与位于 GES DISC 的 CloudSat 轨道 V002 (AMSERR_CPR) 位于同一地点 简介 这是沿云卫星视场轨迹的 AMSR-E 雨率产品子集。子集的目标是选择并返回…

PaddleVideo:Squeeze Time算法移植

参考PaddleVideo/docs/zh-CN/contribute/add_new_algorithm.md at develop PaddlePaddle/PaddleVideo GitHubAwesome video understanding toolkits based on PaddlePaddle. It supports video data annotation tools, lightweight RGB and skeleton based action recognitio…

分类模型的算法性能评价

一、概述 分类模型是机器学习中一种最常见的问题模型&#xff0c;在许多问题场景中有着广泛的运用&#xff0c;是模式识别问题中一种主要的实现手段。分类问题概况起来就是&#xff0c;对一堆高度抽象了的样本&#xff0c;由经验标定了每个样本所属的实际类别&#xff0c;由特定…

List、Map、Set 接口在Java中的存取元素特点

List、Map、Set 接口在Java中的存取元素特点 1、List 接口2、Map 接口3、Set 接口4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;List、Map和Set是三个最常用的集合接口。它们各自有不同的特点和用途&#xff…

Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)

netsh int ip reset 命令是用于重置 Windows 操作系统中的网络设置和配置的命令。 在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。 命令详解&#xff1a; netsh: 用于配置各种网络设置 int: 用于管理网络接口 ip: 用于管理网络接口的 IP 配…

我的FPGA

1.安装quartus 2.更新usb blaster驱动 3.新建工程 1.随便找一个文件夹&#xff0c;里面新建demo文件夹&#xff0c;表示一个个工程 在demo文件夹里面&#xff0c;新建src&#xff08;源码&#xff09;&#xff0c;prj&#xff08;项目&#xff09;&#xff0c;doc&#xff…

LLM 研究方向(一): LLM Prompts--p-tuning、LoRA

目录 1. prompt-tuning background 2. Prompt Tuning 模型介绍 2.1 2021 prefix-tuning 2.2 2021 P-tuning v1 2.3 2021 Parameter-efficient prompt tuning (PET) 2.4 2022 P-tuning v2 2.5 2019 Adapter ​2.6 2021 LoRA (Low-Rank Adaptation) 2.7 2024 DoRA (…

VS Code 配置 C/C++ 编程运行环境(保姆级教程)

文章目录 一、软件下载1. 下载 VS Code 安装工具 2. 下载 MinGW-W64二、安装 VS Code三、安装 MinGW-W64 及配置环境变量四、配置 VS Code 的 C/C 编程运行环境1. 汉化 VS Code&#xff08;选做&#xff09;2. 安装 C/C 扩展包 五、测试 VS Code 的 C/C 编程环境1. 创建代码文件…

PowerShell install 一键部署mysql 9.0.0

mysql 前言 MySQL 是一个基于 SQL(Structured Query Language)的数据库系统,SQL 是一种用于访问和管理数据库的标准语言。MySQL 以其高性能、稳定性和易用性而闻名,它被广泛应用于各种场景,包括: Web 应用程序:许多动态网站和内容管理系统(如 WordPress)使用 MySQL 存…

14-65 剑和诗人39 - 打造你自己的 Devin

​​​​​ 绝密 Devin 架构 更具体地说,构建您自己的 AI 代理。 Devin 使用 GPT-4 ,而人们已经开始用 Claude-3-Opus 构建替代方案 Devin 的 UI 体验更好。 例如,它甚至看不到浏览器,但它确实存在于用户面前 此外,你可以随时与它“交谈”,就像与人交谈一样,它会在后…

基于单片机的温湿度感应智能晾衣杆系统设计

&#xff3b;摘 要&#xff3d; 本设计拟开发一种湿度感应智能晾衣杆系统 &#xff0c; 此新型晾衣杆是以单片机为主控芯片 来控制的实时检测系统 &#xff0e; 该系统使用 DHT11 温湿度传感器来检测大气的温湿度 &#xff0c; 然后通过单 片机处理信息来控制 28BYJ &…

Linux——多线程(五)

1.线程池 1.1初期框架 thread.hpp #include<iostream> #include <string> #include <unistd.h> #include <functional> #include <pthread.h>namespace ThreadModule {using func_t std::function<void()>;class Thread{public:void E…

申请商标用什么颜色:企业和个人申请注册商标攻略!

在申请注册商标到底要用什么颜色&#xff0c;许多初次申请注册主体都不是特别清楚&#xff0c;普推知产商标老杨建议&#xff0c;在一般情况下建议尽量用黑白色&#xff0c;因为商标用黑白色在使用时可以着任何色。 在用黑色申请注册成功&#xff0c;别的主体用其它颜色要在同…

区域特征检测工具的使用

区域特征检测工具的使用 选择区域-》右键-》工具->特征检测

C 语言中如何进行冒泡排序?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

华为od100问持续分享-1

我是一名软件开发培训机构老师&#xff0c;我的学生已经有上百人通过了华为OD机试&#xff0c;学生们每次考完试&#xff0c;会把题目拿出来一起交流分享。 重要&#xff1a;2024年5月份开始&#xff0c;考的都是OD统一考试&#xff08;D卷&#xff09;&#xff0c;题库已经整…

CentOS6用文件配置IP模板

CentOS6用文件配置IP模板 到 CentOS6.9 , 默认还不能用 systemctl , 能用 service chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 ### chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 sudo chkconfig sshd onservice sshd start …

grep对文件内容搜索(附重要拓展-正则表达式)

文件搜索是搜索查找符合条件的某文件的目录&#xff0c;若要编辑文件或对文件的某配置进行修改&#xff0c;就需要对文件内容进行搜索。 grep 命令是 Linux 及类 Unix 操作系统中的一个强大的文本搜索工具&#xff0c;用于搜索一个或多个文件中匹配给定模式的行。grep 代表“Gl…