Qt 实战(6)事件 | 6.1、事件机制

文章目录

  • 一、事件
    • 1、基本概念
    • 2、事件描述
    • 3、事件循环
    • 4、事件分发
      • 4.1、QApplication::notify()
      • 4.2、QObject::event()
    • 5、事件传递
    • 6、事件处理器

前言:

Qt 框架中的事件机制(Event Mechanism)是一种核心功能,它允许应用程序以事件驱动的方式响应各种外部和内部发生的动作。事件机制在 Qt 中扮演着至关重要的角色,无论是在用户界面的交互还是在后台处理数据时。它不仅确保了程序的响应性和灵活性,还大大降低了编程的复杂性,使开发者能够以更直观的方式来处理异步事件。

一、事件

1、基本概念

事件是由程序的内部或外部产生的事情或某种操作的统称。例如:用户按下鼠标或键盘就会产生一个鼠标或键盘事件,当窗口第一次绘制时会产生一个绘制事件。Qt中的事件主要来源于以下几个方面:

  • 用户输入:如鼠标点击、键盘按键、触摸屏操作等。
  • 系统事件:如窗口大小改变、系统时间变化、网络状态改变等。
  • 定时器事件:通过QTimer类创建的定时器事件。
  • 其他事件:如自定义事件、信号与槽机制触发的事件等

事件的作用:事件在 Qt 应用程序中扮演着至关重要的角色。它们是应用程序与用户或系统交互的基础,使得程序能够以非阻塞的方式响应外部的变化。通过事件,Qt 应用程序能够保持响应性和灵活性,同时简化复杂交互的处理逻辑。

2、事件描述

在Qt中使用抽象类QEvent类来描述事件,所有事件都是QEvent的派生类。基本的QEvent类只包含一个事件类型参数,QEvent的子类包含额外的参数用来描述事件信息。事件类型使用QEvent::type来表示,这个枚举类定义了Qt中有效的事件类型。Qt中常见的事件有

  • 键盘事件(QKeyEvent)
  • 鼠标事件(QMouseEvent)
  • 拖放事件(QDragEvent 和 QDropEvent)
  • 绘图事件(QPaintEvent)
  • 焦点事件(QFocusEvent)

3、事件循环

通过QApplication::exec() 开启事件循环,事件循环运行在一个无限循环中,不断检查是否有新的事件发生。当事件发生时,它们被加入到一个队列中。事件循环按照事件发生的顺序,从队列中取出并分发这些事件到相应的对象进行处理。这个过程是异步的,意味着事件的产生和处理是分离的,确保了应用程序的高效运行。事件循环是保持 Qt 应用程序响应性的关键。没有事件循环,应用程序将无法适时地响应用户输入、网络通信等事件。

在这里插入图片描述

4、事件分发

4.1、QApplication::notify()

在 Qt 的事件系统中,所有的事件(如鼠标点击、键盘输入、定时器事件等)都会经过 notify 方法进行分发。notify 方法原型如下:

bool notify(QObject *, QEvent *) Q_DECL_OVERRIDE;

默认情况下,notify 方法会调用相应对象(接受事件的对象)的 QObject::event 方法来处理这些事件。但可以通过重写 notify 方法来定制事件的处理方式。具体来说,QApplication::notify 的作用包括:

  • 事件分发:当 Qt 检测到一个事件(如鼠标点击、键盘输入等)时,它会调用 QApplication 的 notify 方法来分发这个事件。
  • 事件过滤:在事件被发送到目标对象之前,你可以通过重写 notify 方法来过滤或修改事件。例如,你可以阻止某个特定类型的事件被发送到某个对象。

一般来说,直接重写 QApplication 的 notify 方法并不常见,因为这样做会影响整个应用程序的事件处理。但在某些特殊情况下,如实现全局的事件过滤器或自定义事件分发策略时,重写 notify 方法可能会非常有用。

4.2、QObject::event()

QObject::event 在 Qt 框架中是一个重要的成员函数,用于处理接收到的 QEvent 对象,并将这些事件按照不同的类型,分发给不同的事件处理器。Qt中QObject::event的源码如下:

bool QObject::event(QEvent *e)
{switch (e->type()) {case QEvent::Timer:timerEvent((QTimerEvent*)e);break;case QEvent::ChildAdded:case QEvent::ChildPolished:case QEvent::ChildRemoved:childEvent((QChildEvent*)e);break;// ...default:if (e->type() >= QEvent::User) {customEvent(e);break;}return false;}return true;
}

5、事件传递

如果对象没有处理该事件(即没有重写对应的事件处理函数或函数中没有调用event->accept()),Qt会尝试将该事件传递给其父对象。这个过程会一直持续到某个对象处理了事件或事件到达了顶级对象(如应用程序窗口)为止。这就是所谓的“事件冒泡”(event bubbling)。

6、事件处理器

如果Qt找到了一个与事件相关的对象,它会调用该对象的事件处理器(也称为事件处理函数),这些事件处理器都是虚函数,直接重写对应的虚函数就可以处理自己的业务。下面是常见的事件及事件处理器,如下:

  • 鼠标事件(QMouseEvent)
    • mousePressEvent(QMouseEvent *event): 处理鼠标按键的按下事件
    • mouseReleaseEvent(QMouseEvent *event): 处理鼠标按键的释放事件。
    • mouseMoveEvent(QMouseEvent *event): 处理鼠标移动事件。
    • wheelEvent(QWheelEvent *event): 处理鼠标滚轮的滚动事件。
  • 键盘事件(QKeyEvent)
    • keyPressEvent(QKeyEvent *event): 处理键盘按键的按下事件。
    • keyReleaseEvent(QKeyEvent *event): 处理键盘按键的释放事件。

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

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

相关文章

文华WH7主图多空预警系统指标公式源码

RSV:(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;//收盘价与N周期最低值做差,N周期最高值与N周期最低值做差,两差之间做比值定义为RSV K:SMA(RSV,3,1);//RSV的移动平均 D:SMA(K,3,1);//K值的移动平均 DIFF : EMA(CLOSE,12) - EMA(CLOSE,26); D…

springboot集成达梦数据库,打包后,tomcat中启动报错

背景&#xff1a;springboot集成达梦数据库8&#xff0c;在工具idea中正常使用&#xff0c;但是打包后&#xff0c;无法启动&#xff0c;报错 pom引入的依赖 但是这种情况&#xff0c;只有在idea中启动没问题的解决方法 需要修改引入的依赖&#xff0c;再次打包就可以 <d…

考研数学一有多难?130+背后的残酷真相

考研数学一很难 大家平时在网上上看到很多人说自己考了130&#xff0c;其实这些人只占参加考研数学人数的极少部分&#xff0c;有个数据可以展示出来考研数学到底有多难&#xff1a; 在几百万考研大军中&#xff0c;能考到120分以上的考生只有2%。绝大多数人的分数集中在30到…

Lua流媒体服务器支持(MP4视频、桌面直播、摄像头)

本来在做FFMPEG的项目&#xff0c;忽然想到Lua封装FFMPEG与SRS实现一个简易的直播网站何尝不是一个大胆的想法。 示例为初级版本&#xff0c;主要是用来验证可行性和功能性DEMO 演示效果&#xff1a; Lua流媒体直播服务器(支持MP4、桌面直播、摄像头)_哔哩哔哩_bilibili 代码简…

【SSM】医疗健康平台-用户端-体检预约

知识目标 了解FreeMarker&#xff0c;能够简述FreeMarker的作用和生成文件的原理 熟悉FreeMarker的常用指令&#xff0c;能够在FTL标签中正确使用assign指令、include指令、if指令和list指令 掌握显示套餐列表功能的实现 掌握显示套餐详情功能的实现 掌握体检预约功能的实现…

【源码】最新源支付系统源码 V7版全开源 免授权 附搭建教程

最新源支付系统源码_V7版全开源_免授权_附详细搭建教程_站长亲测 YPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的thin…

el-form重置后input无法输入问题

新增用户遇到的问题&#xff1a; 如果你没有为 formData 设置默认值&#xff0c;而只是将其初始化为空对象 {}&#xff0c;则在打开dialog时&#xff0c;正常输入&#xff0c; formdata会变成如下 但是&#xff0c;打开后&#xff0c;直接使用 resetFields 或直接清空表单&…

宜搭低代码开发高级认证例题1-待办列表

1、进行中待办和已完成待办界面相同 关键代码就是重要度默认为1星 2、新增自定义页面Todolist 2.1主要参数设置-新建远和API getTodoList和getDoneList代码相同 绑定代码&#xff1a;/${window.pageConfig.appType || window.g_config.appKey}/v1/form/searchFormDatas.json …

福州代理记账服务财务专业知识会计助手

福州的代理记服务可探索企业和个体工商户处理财务和会计工作。选择合适的代理记服务不仅可以节省成本&#xff0c;还可以确保财务工作专业、合规。以下是一些关于代理记服务的关键信息和财务信息&#xff0c;供您参考&#xff1a; https://www.9733.cn/news/detail/180.html …

C++ ─── vector的实现

知识点&#xff1a; ① 因为vector是模版&#xff0c;所以声明和定义都放在.h中&#xff0c;防止出现编译错误 .h不会被编译&#xff0c;在预处理中.h在.cpp中展开所以在编译时只有.cpp 而 .cpp顺序编译&#xff0c;只会进行向上查找&#xff0c;因此至少有函数的声明。 ②memc…

【数据结构与算法】堆排序算法 详解

堆排序算法 Status heapAdjust(ElemType *a, int s, int m) {ElemType t a[s];for (int j s * 2 1; j < m; j j * 2 1) {if (j < m && a[j] < a[j 1]) {j;}if (t > a[j]) {break;}a[s] a[j];s j;}a[s] t;return OK; }Status heapSort(ElemType *a…

xhs 旋转验证码剖析和协议算法实现

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#…

计算机视觉的职业规划

Hi&#xff0c;大家好。我是茶桁。 今天这节课呢&#xff0c;咱们先不着急讲原理&#xff0c;先来讲讲职业规划的话题。 如果想要直接上手企业级的 AI 项目&#xff0c;可以看看咱们的「AI 人工智能企业项目实战」。 趋势和薪资 首先&#xff0c;先来讲讲就业的趋势。其实学…

JavaWeb——MySQL:DDL

目录 3. DQL:查询 ​编辑3.3 排序查询&#xff08;order by&#xff09; &#xff08;1&#xff09;排序 &#xff08;2&#xff09;多字段排序&#xff1a; &#xff08;3&#xff09;总结&#xff1a; 3. DQL:查询 查询是使用最多、最频繁的操作&#xff0c;因为前面的…

开心汉化轻量级工单与知识库一体化管理系统源码

开心汉化发布&#xff1a;轻量级工单与知识库一体化管理系统源码 我们很高兴地宣布&#xff0c;开心汉化团队现已发布一款轻量级工单与知识库一体化管理系统的汉化源码。该系统不仅功能强大&#xff0c;而且易于部署和管理&#xff0c;适用于各类企业或个人管理大量工单数据的…

微软结束将数据中心置于海底的实验

2016 年&#xff0c;微软 宣布了一项名为"纳蒂克项目"&#xff08;Project Natick&#xff09;的实验。基本而言&#xff0c;该项目旨在了解数据中心能否在海洋水下安装和运行。经过多次较小规模的测试运行后&#xff0c;该公司于 2018 年春季在苏格兰海岸外 117 英尺…

密码学及其应用 —— Java中的安全性

1. 简介 Java是一种广泛使用的编程语言&#xff0c;特别是在企业级解决方案中&#xff0c;比如使用J2EE、JavaBeans等技术。在Web开发领域&#xff0c;Java也有其应用&#xff0c;如客户端的applet和服务器端的Servlets/JSP。 1.1 Java的特点 面向对象&#xff1a;Java是一种面…

【个人博客搭建】(26)发布后端webapi项目

1、选择启动的webapi&#xff0c;右击发布 2、选择左下角的“显示所有设置” 在上一页按钮那边是发布文件夹的目录 地址&#xff0c; 现在界面的就是配置的信息&#xff0c; 配置&#xff1a;Debug、Release 目标框架&#xff1a;我们用的net8.0&#xff0c;就是他&#xff…

FPGA学习笔记(5)——硬件调试与使用内置的集成逻辑分析仪(ILA)IP核

如果要对信号进行分析&#xff0c;可以使用外置的逻辑分析仪&#xff0c;但成本较高&#xff0c;对初学者来说没有必要&#xff0c;可以使用Xilinx Vivado内自带的逻辑分析仪IP核对信号进行分析&#xff0c;不过需要占用一定的芯片资源。 本节采用上一节配置的LED灯闪烁代码&a…

学习记录697@数据通信基础之异步通信和同步通信

最近在看计算机网络物理层部分&#xff0c;涉及到异步通信和同步通信&#xff0c;这个和通信知识相关。 异步通信和同步通信都是为了解决时钟同步问题&#xff0c;这个和编程中的同步和异步是不一样的概念。 时钟同步 我的理解是&#xff0c;发送者发送一系列信号&#xff0…