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

Qt——事件处理详解

Qt事件处理

一、事件基础

事件是Qt应用程序中的基本构建块,它们代表了一些特定的行为或状态变化。事件可以是鼠标点击、键盘输入、窗口大小改变、定时器事件等。每个事件都是一个对象,继承自QEvent类。

二、事件常见类型

Qt中的事件分为多种类型,每种类型对应不同的行为。以下是一些常见的事件类型:
1、键盘事件(QKeyEvent): 处理键盘按键的按下和松开事件。

2、鼠标事件(QMouseEvent): 处理鼠标移动、鼠标按键的按下和松开事件。

3、拖放事件(QDragEvent 和 QDropEvent): 用鼠标进行拖放操作时涉及的事件,包括拖拽和放置。

4、滚轮事件(QWheelEvent): 处理鼠标滚轮的滚动事件。

5、绘图事件(QPaintEvent): 在控件需要重新绘制时触发,用于自定义绘制。

6、定时事件(QTimerEvent): 在定时器到期时触发,用于执行周期性任务。

7、焦点事件(QFocusEvent): 处理键盘焦点的移动,如窗口控件获得或失去焦点。

8、进入和离开事件(QEnterEvent 和 QLeaveEvent): 处理鼠标移入或移出窗口控件的事件。

9、移动事件(QMoveEvent): 处理窗口控件的位置改变事件。

10、大小改变事件(QResizeEvent): 处理窗口控件的大小改变事件。

11、显示和隐藏事件(QShowEvent 和 QHideEvent): 处理窗口控件的显示和隐藏事件。

12、窗口事件(QWindowStateChangeEvent): 处理窗口是否为当前窗口的状态变化事件。

三、事件接收者

每个继承自QObject的类都可以成为一个事件接收者,这意味着它能够接收并处理事件。窗口小部件(widget)如QWidget、QMainWindow以及其他继承自它们的控件都是事件接收者的例子。

四、事件过滤器

Qt允许您在事件到达接收者之前拦截和处理事件。这通过事件过滤器实现,即在事件到达目标对象之前先经过另一个对象的处理。这对于全局事件处理或者对多个对象应用相同逻辑的情况非常有用。

五、事件处理步骤

1、选择事件接收者:

首先,您需要确定哪个对象将成为事件的接收者。通常,这是一个继承自QWidget的窗口小部件或其他继承自QObject的类。

2、重写事件处理函数:

根据您要处理的事件类型,在事件接收者类中找到相应的事件处理函数,并进行重写。每个事件类型都对应一个特定的函数,例如:keyPressEvent、mousePressEvent、paintEvent等。

3、编写事件处理逻辑:

在事件处理函数中,您可以编写处理特定事件的代码逻辑。例如,在keyPressEvent中,您可以检查按下的键,并根据需要执行操作。

4、调用基类事件处理函数:

如果您希望在处理完事件后将其传递给基类进行进一步处理,可以通过调用基类的事件处理函数来实现。这在您希望继续保留默认行为的情况下很有用。

六、常见三种事件处理应用

1、重写特定的事件处理函数

例如:mousePressEvent(), keyPressEvent(), paintEvent() 这样的特定事件处理函数

下面是重写特定的keyPressEvent()函数实现键盘上、下、左和右键盘的控制

void Widget::keyPressEvent(QKeyEvent *event)
{switch (event->key()) {case Qt::Key_Up:ui->label->move(ui->label->x(), ui->label->y()-4);break;case Qt::Key_Down:ui->label->move(ui->label->x(), ui->label->y()+4);break;case Qt::Key_Left:ui->label->move(ui->label->x()-4, ui->label->y());break;case Qt::Key_Right:ui->label->move(ui->label->x()+4, ui->label->y());break;default:break;}
}

下面是重写特定的mouseMoveEvent()函数实现

//鼠标特殊设备,必须按下任意键 移动时才会产生鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{//x():获取当前鼠标在界面的x轴坐标ui->label->move(event->x() - ui->label->width()/2, event->y() - ui->label->height()/2);
}

2、重写所有事件的处理函数(event())

  • 1、界面的产生的任何事件处理首先是调用基类的event()方法进行处理
  • 2、event()函数内部,判断事件的类型,然后迪奥用基类的特定的事件出来器进行处理
  • 3、如果是派生类重写了特定事件处理器,则event()调用了派生类重写的虚函数,实现新功能

注意:如果派生类的重写了event()虚函数,则界面产生的事件预先调用派生类重写的event()方法

  • ①判断自己感兴趣的事件,实现新功能,处理完返回true
  • ②不感兴趣的事件,则需要手动调用基类QWidgetevent()函数进行默认处理,返回基类处理的结果
bool Widget::event(QEvent *event)
{if(event->type() == QKeyEvent::KeyPress){//这里我们直接调用上面重写特定好的函数实现鼠标按下的事件keyPressEvent((QKeyEvent *)event);return true;}if(event->type() == QMouseEvent::MouseMove){//这里就是直接把重写鼠标移动MouseMove事件逻辑的全部代码放到里面来QMouseEvent *e = (QMouseEvent *)event;ui->label->move(e->x() - ui->label->width()/2, e->y() - ui->label->height()/2);return true;}return QWidget::event(event);
}

3、重写(在对象上安装)事件过滤器

事件过滤器目的是筛选出感兴趣的控件上产生的感兴趣的事件

bool QObject::eventFilter(QObject *watched, QEvent *event);

watched:感兴趣的对象
event:事件

installEventFilter( const QOject *obj );

步骤

  • ①重写eventFilter函数
  • ②将关注的控件加载到安装到当前类的过滤器中,installEventFilter(this);这样在该控件上产生的任何事件都优先调用eventFilter(),不会调用event()
bool Widget::eventFilter(QObject *watched, QEvent *event)
{//判断该事件产生的对象是否感兴趣的控件if(watched == ui->label_2){//再次判断该控件上产生的事件是否为按兴趣的事件if(event->type() == QMouseEvent::MouseButtonPress){QMouseEvent *e = (QMouseEvent *)event;if(e->button() == Qt::LeftButton){ui->label->setStyleSheet("background-color:#aa00ff;");qDebug()<<"LeftButton";}if(e->button() == Qt::MiddleButton){ui->label->setStyleSheet("background-color:#ff00ff;");qDebug()<<"MiddleButton";}if(e->button() == Qt::RightButton){ui->label->setStyleSheet("background-color:#dd000f;");qDebug()<<"RightButton";}return true;}/*该控件上不感兴趣的事件,都忽略*return false;*该控件上的事件其他不该兴趣的事件交给基类处理*return QWidget::eventFilter(watched, event);*/return QWidget::eventFilter(watched, event);}/**凡是不感兴趣的控件上的事件,都交给基类来处理*return QWidget::eventFilter(watched, event);*/return QWidget::eventFilter(watched, event);
}

关于事件过滤器的返回值需要注意的三个点
①对该对象感兴趣的事件执行好后返回true,对该对象不感兴趣的事件返回false(都忽略)
②对一个或几个对象上的事件感兴趣,其他不该兴趣的事件交给基类的event()函数来处理,并返回的结果作为事件的处理结果

return QWidget::eventFilter(watched, event);

③凡是不感兴趣的对象上的事件,也都交给基类来处理

return QWidget::eventFilter(watched, event);

相关文章:

Qt——事件处理详解

Qt事件处理 一、事件基础 事件是Qt应用程序中的基本构建块&#xff0c;它们代表了一些特定的行为或状态变化。事件可以是鼠标点击、键盘输入、窗口大小改变、定时器事件等。每个事件都是一个对象&#xff0c;继承自QEvent类。 二、事件常见类型 Qt中的事件分为多种类型&…...

基于位置管理的企业员工考勤打卡系统设计 微信小程序

员工考勤打卡系统设计app是针对员工必不可少的一个部分。在公司发展的整个过程中&#xff0c;员工考勤打卡系统设计app担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类员工考勤打卡系统设计app程序也在不断改进。本课题所设计的 MVC基于HBuilder X的员工考勤…...

adb 查找应用包名,应用 Activity 等信息

列出设备上的包 不使用参数&#xff1a;adb shell pm list packages&#xff0c;打印设备/模拟器上的所有软件包 根据包名查看应用的activity 命令&#xff1a; dumpsys package 包名 adb shell dumpsys package 包名 petrel-cv96d:/data/app # dumpsys package com.instal…...

八、SpringBoot集成Kafka

目录 一、添加依赖二、SpringBoot 生产者三、SpringBoot 消费者 一、添加依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><depend…...

联网智能实时监控静电离子风机的工作流程

联网智能实时监控静电离子风机是通过将静电离子风机与互联网连接&#xff0c;实现对其状态和性能的远程监控和管理。 具体实现该功能的方法可以包括以下几个步骤&#xff1a; 1. 传感器安装&#xff1a;在静电离子风机上安装适当的传感器&#xff0c;用于感知相关的参数&…...

第12章 微信支付

mini商城第12章 微信支付 一、课题 微信支付 二、回顾 1、分布式事务 2、分布式事务理论 3、掌握分布式事务解决方案模型 4、能基于Seata解决强一致性分布式事务 5、能基于RocketMQ解决柔性事务 三、目标 1、密码安全学 摘要加密 Base64 对称加密 2、微信支付 微信支…...

Java基础二十二(对集合元素排序比较)

对集合元素排序比较 1. 使用 Comparable 接口实现默认排序 Comparable 是 Java 中的一个接口&#xff0c;用于定义对象之间的排序规则。 实现了 Comparable 接口的类可以比较其对象的大小&#xff08;包装类都实现了该接口&#xff09;&#xff0c;从而可以在集合类&#xf…...

(15)线程的实例认识:同步,异步,并发,并发回调,事件,异步线程,UI线程

参看&#xff1a;https://www.bilibili.com/video/BV1xA411671D/?spm_id_from333.880.my_history.page.click&vd_source2a0404a7c8f40ef37a32eed32030aa18 下面是net framework版本 一、文件构成 1、界面如下。 (1)同步与异步有什么区别&#xff1f; …...

长胜证券:华为“黑科技”点燃A股炒作激情

8月29日&#xff0c;在未举行相关发布会的情况下&#xff0c;华为新款手机Mate60Pro悄然上线开售&#xff0c;并在一小时内售罄。 金融出资报记者注意到&#xff0c;跟着商场对新机重视的继续发酵&#xff0c;其中的各种技能打破也愈加受到重视&#xff0c;其影响很快扩散到资…...

Kubernetes(k8s)上部署redis5.0.14

Kubernetes上部署redis 环境准备创建命名空间 准备PV和PVC安装nfs准备PV准备PVC 部署redis创建redis的配置文件部署脚本挂载数据目录挂载配置文件通过指定的配置文件启动redis 集群内部访问外部链接Redis 环境准备 首先你需要一个Kubernetes环境&#xff0c;可参考我写的文章&…...

frida动态调试入门01——定位关键代码

说明 frida是一款Python工具可以方便对内存进行hook修改代码逻辑在移动端安全和逆向过程中常用到。 实战 嘟嘟牛登录页面hook 使用到的工具 1&#xff0c;jadx-gui 2&#xff0c;frida 定位关键代码 使用jadx-gui 进行模糊搜索&#xff0c;例如搜索encyrpt之类的加密关键…...

ASP.NET Core 8 的配置类 Configuration

Configuration Configuration 可以从两个途径设置&#xff1a; WebApplication创建的对象app.Configuration 属性WebApplicationBuilder 创建的 builder.Configuration 属性 app的Configuration优先级更高&#xff0c;host Configuration作为替补配置&#xff0c;因为app运行…...

MySql增量恢复

一、 使用二进制日志的时间点恢复 注意 本节和下一节中的许多示例都使用mysql客户端来处理mysqlbinlog生成的二进制日志输出。如果您的二进制日志包含\0&#xff08;null&#xff09;字符&#xff0c;那么mysql将无法解析该输出&#xff0c;除非您使用--binary模式选项调用它。…...

设计模式--装饰者模式(Decorator Pattern)

一、什么是装饰者模式&#xff08;Decorator Pattern&#xff09; 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你在不修改现有对象的情况下&#xff0c;动态地将新功能附加到对象上。这种模式通过创建一个包装类&#xff0c;…...

Spring三级缓存解决循环依赖

Spring三级缓存解决循环依赖 一 Spring bean对象的生命周期 二 三级缓存解决循环依赖 实现原理解析 spring利用singletonObjects, earlySingletonObjects, singletonFactories三级缓存去解决的&#xff0c;所说的缓存其实也就是三个Map 先实例化的bean会通过ObjectFactory半…...

Vscode自动移出不用的包

Vscode自动移出不用的包 在Vscode中删除不用的包、Vscode移出不用的包、Vscode移出不用的import包 设置 找到setting.json&#xff08;在字体设置里面&#xff09;&#xff0c;添加如下配置 "editor.codeActionsOnSave": { "source.organizeImports": tru…...

leetcode做题笔记120. 三角形最小路径和

给定一个三角形 triangle &#xff0c;找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 1 的两个结点。也就是说&#xff0c;如果正位于当前行的下标 i &#xff0c;那么下一…...

weblogic/CVE-2018-2894文件上传漏洞复现

启动docker环境 查看帮助文档 环境启动后&#xff0c;访问http://your-ip:7001/console&#xff0c;即可看到后台登录页面。 执行docker-compose logs | grep password可查看管理员密码&#xff0c;管理员用户名为weblogic&#xff0c;密码为lFVAJ89F 登录后台页面&#xff0c;…...

windows10默认浏览器总是自动更改为Edge浏览器

在设置的默认应用设置中把默认浏览器改为chrome或其他之后他自动又会改回Edge。不得不说*软真的狗。 解决办法&#xff1a; 后来发现在Edge浏览器的设置中有这么一个选项&#xff0c;会很无耻的默认是Edge。把它关掉后重新设置就行了。...

系统架构设计师考试论文:论软件架构风格与应用

软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。体系结构风格定义一个系统家族&#xff0c;即一个体系结构定义一个词汇表和一纽约束。词汇表中包含一些构件和连接件类型&#xff0c;而这组约束指出系统是如何将这些构件和连接件组合起来的。体系结构风格反…...

LinuxVLAN接口异常定位实战

LinuxVLAN接口异常定位实战这是一篇面向中级 Linux 使用者的技术文章&#xff0c;主题聚焦在VLAN接口&#xff0c;重点讨论链路隔离、子接口和二层网络划分。在真实生产环境中&#xff0c;VLAN接口相关问题往往不会以单一错误形式出现&#xff0c;而是混杂在日志、权限、资源状…...

YOLO26优化:TIP2026 FourierSR | FourierSR引入YOLO C3k2:解决感受野局限,实现高效全局特征交互

💡💡💡现有 YOLO C3k2 模块主要基于卷积与跨阶段部分连接,虽能平衡计算与精度,但仍存在以下问题: 感受野受限:堆叠的小核卷积(如 33)感受野有限,难以捕获全局上下文,对尺度变化大或远距离依赖的目标(如小目标、遮挡目标)特征提取能力不足。 特征混合效率低:通…...

基于 HarmonyOS 6.0 的家政服务预约页面实战开发:ArkUI 页面构建与跨端设计深度解析

基于 HarmonyOS 6.0 的家政服务预约页面实战开发&#xff1a;ArkUI 页面构建与跨端设计深度解析 前言 随着 HarmonyOS 生态逐渐成熟&#xff0c;HarmonyOS NEXT 与 HarmonyOS 6.0 的持续推进&#xff0c;越来越多开发者开始从传统 Android、Flutter、Web 技术栈逐步迁移到鸿蒙原…...

别再死记硬背物联网四层架构了!用LoRa和ESP32手把手搭个智能花盆,实战理解每一层

从智能花盆实战理解物联网四层架构&#xff1a;LoRaESP32全流程拆解 每次翻开物联网教材&#xff0c;总能看到那个经典的四层架构图&#xff1a;感知层、网络层、平台层、应用层。但真正动手做项目时&#xff0c;却发现理论和实践之间隔着一道鸿沟。今天我们就用最接地气的方式…...

边缘计算与机器视觉在产线质检中的实战应用与优化

1. 项目概述&#xff1a;当产线质检遇上边缘计算与机器视觉在制造业的车间里&#xff0c;质检环节一直是效率与质量的“卡脖子”点。传统的人工目检&#xff0c;不仅劳动强度大、易受疲劳和情绪影响&#xff0c;而且标准难以统一&#xff0c;漏检、误检时有发生。而将高清相机拍…...

告别PCL!用Qt+QGLWidget手把手教你打造自己的3D点云查看器(附完整源码)

轻量级3D点云可视化&#xff1a;基于Qt与OpenGL的高效实现方案 在工业测量、自动驾驶和三维重建等领域&#xff0c;点云数据的可视化一直是开发者面临的挑战。传统方案如PCL虽然功能强大&#xff0c;但其庞大的体积和复杂的依赖链往往让项目变得臃肿。本文将展示如何利用Qt的QG…...

Claude Code 可观测性工程爆火全解析:AI Agent 日志、遥测、追踪、成本监控与安全治理一次讲透

导语&#xff1a;AI Agent 真正进入生产环境后&#xff0c;最重要的问题不再是“能不能跑”&#xff0c;而是“跑得怎么样、哪里慢、哪里错、成本多少、有没有泄露、能不能恢复”。可观测性工程&#xff0c;就是把这些问题变成可度量、可告警、可追踪、可治理的系统能力。一图看…...

12306智能抢票助手终极指南:5步实现自动化抢票,告别手动刷票烦恼

12306智能抢票助手终极指南&#xff1a;5步实现自动化抢票&#xff0c;告别手动刷票烦恼 【免费下载链接】12306 12306智能刷票&#xff0c;订票 项目地址: https://gitcode.com/gh_mirrors/12/12306 还在为节假日抢不到火车票而烦恼吗&#xff1f;&#x1f62b; 12306智…...

RAG夺命10连问,你能抗住第几问?

前言最近金三银四&#xff0c;很多小伙伴在准备大厂面试&#xff0c;几乎每个人都被问到了同一个技术点——RAG&#xff08;检索增强生成&#xff09;。从阿里到字节&#xff0c;从腾讯到美团&#xff0c;RAG已经成为大模型应用方向必考的“压轴题”。但是&#xff0c;很多求职…...

FactoryIO虚拟仓储避坑指南:从入仓出仓到急停处理的完整调试流程

FactoryIO虚拟仓储避坑实战&#xff1a;从坐标校准到多任务管理的深度调试手册 当第一次在FactoryIO中搭建虚拟仓储系统时&#xff0c;我盯着屏幕上那个69的货架模型&#xff0c;满心以为两小时就能搞定入仓出仓逻辑。直到凌晨三点&#xff0c;我还在和那个永远差0.006的坐标值…...