Qt学习之路(21): event()

Event()函数 当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。 使用程序代码对event的事件分发进行相关描述: bool MyWidget::event(QEvent *event) { //事件分发,若在MyWidget中产生了事件则必须经过该函数去进行事件分发。 /* 阅读详情
今天要说的是event()函数。记得之前曾经提到过这个函数,说在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。

event()函数主要用于事件的分发,所以,如果你希望在事件分发之前做一些操作,那么,就需要注意这个event()函数了。为了达到这种目的,我们可以重写event()函数。例如,如果你希望在窗口中的tab键按下时将焦点移动到下一组件,而不是让具有焦点的组件处理,那么你就可以继承QWidget,并重写它的event()函数,已达到这个目的:

bool MyWidget:: event(QEvent * event) {
         if ( event->type() == QEvent::KeyPress) {
                QKeyEvent *keyEvent = static_cast<QKeyEvent *>( event);
                 if (keyEvent->key() == Qt::Key_Tab) {
                         // 处理Tab鍵
                         return  true;
                }
        }

         return QWidget:: event( event);
}

event()函数接受一个QEvent对象,也就是需要这个函数进行转发的对象。为了进行转发,必定需要有一系列的类型判断,这就可以调用QEvent的type()函数,其返回值是QEvent::Type类型的枚举。我们处理过自己需要的事件后,可以直接return回去,对于其他我们不关心的事件,需要调用父类的event()函数继续转发,否则这个组件就只能处理我们定义的事件了。

event()函数返回值是bool类型,如果传入的事件已被识别并且处理,返回true,否则返回false。如果返回值是true,QApplication会认为这个事件已经处理完毕,会继续处理事件队列中的下一事件;如果返回值是false,QApplication会尝试寻找这个事件的下一个处理函数。

event()函数的返回值和事件的accept()和ignore()函数不同。accept()和ignore()函数用于不同的事件处理器之间的沟通,例如判断这一事件是否处理;event()函数的返回值主要是通知QApplication的notify()函数是否处理下一事件。为了更加明晰这一点,我们来看看QWidget的event()函数是如何定义的:

bool QWidget:: event(QEvent * event) {
         switch (e->type()) {
         case QEvent::KeyPress:
                 keyPressEvent((QKeyEvent *) event);
                 if (!((QKeyEvent *) event)->isAccepted())
                         return  false;
                 break;
         case QEvent::KeyRelease:
                keyReleaseEvent((QKeyEvent *) event);
                 if (!((QKeyEvent *) event)->isAccepted())
                         return  false;
                 break;
                 // more...
        }
         return  true;
}

QWidget的event()函数使用一个巨大的switch来判断QEvent的type,并且分发给不同的事件处理函数。在事件处理函数之后,使用这个事件的isAccepted()方法,获知这个事件是不是被接受,如果没有被接受则event()函数立即返回false,否则返回true。

另外一个必须重写event()函数的情形是有自定义事件的时候。如果你的程序中有自定义事件,则必须重写event()函数以便将自定义事件进行分发,否则你的自定义事件永远也不会被调用。关于自定义事件,我们会在以后的章节中介绍。

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/230883

QT中鼠标位置获取问题之event->globalPos()与pos()函数 最近在学习QT,准备做个界面程序,在获取鼠标位置信息时,查了好多资料,对于event->globalPos()与pos()函数都说的不是很清楚。 通过程序测试,最后是搞清楚了,在这利用形象的图解来代替文字像大家描述。 widget窗口是带边框的类型,如下图(上边框和侧边框都是有厚度的) 1.而由event->globalPos()获取的鼠标位置是鼠标偏离电脑屏幕左上角(x=0,y=0 阅读详情

相关推荐

从想法到零件:手把手拆解一个汽车功能如何从PRD写到SSTS和CTS

本文详细拆解了汽车电子需求从市场文档(MRD)到零部件技术规范(CTS)的完整流程,以雨天自动关窗功能为例,展示了PRD、SSTS和CTS的编写要点与交互设计。文章重点解析了系统分解的艺术和零部件落地的精确参数要求,为汽车电子工程师提供了从概念到实现的全流程实践指南。

weixin_30300225的博客 480

事件分发器——event()函数(事件过滤)

【代码】事件分发器——event()函数(事件过滤)

hw5230的博客 425

从零到一:TI AWR1843 Boost EVM与DCA1000 EVM的ADC数据采集实战指南

本文详细介绍了TI AWR1843 Boost EVM与DCA1000 EVM的ADC数据采集实战指南,涵盖硬件连接、软件配置、固件烧录、雷达参数设置及数据处理等关键步骤。通过MATLAB等工具,开发者可高效实现毫米波雷达数据采集,适用于自动驾驶、工业检测等领域。

weixin_29001327的博客 966

20黑马QT笔记之event函数

20黑马QT笔记之event函数 1 event()函数: 1.1 重写event()函数提前处理事件: 事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。 如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一...

weixin_44517656的博客 1152

从‘哒哒’声到静音顺滑:一文搞懂42步进电机细分控制的原理与实战(以TMC5160为例)

本文详细解析了42步进电机细分控制技术,以TMC5160为例,探讨如何通过正弦波电流调制和自适应波形整形实现静音运行。文章提供了实战配置指南,包括硬件连接、寄存器配置和调试技巧,帮助用户有效消除电机噪声,提升3D打印机、CNC机床等设备的运行效率。

weixin_42657024的博客 313

Unity插件——WebView内嵌网页/浏览器插件

一、相关插件: 1、Embedded Browser 插件(文件夹名ZFBrowserUnity) 2、UniWebView插件 3、UnityAndroidWebviewToTexture插件 4、3D WebView for Android插件 二、遇到的问题: 3D WebView显示问题 项目中使用3D WebView存在的问题 三、插件使用 Embedded Browser 加载页面的使用

青岚岁叶的博客 1万+

Qt中QEvent的accept和ignore函数 事件 (以QLabel事件重载为例)

Qt中QEvent的accept和ignore函数QApplication::notify() (用来发送一个事件)QObject::eventFilter() (用来过滤事件,即接收拦截别的对象的事件,并处理)QObject::event() (接收发送给自己这个对象的事件)Qt事件相关函数的两种通信方式:1、通过返回值;2、通过accept和ignore在Qt事件传递和接收相关的函数中,QAp...

吾生也有涯,而知也无涯 1万+

setoolkit克隆网站获取用户信息

一、环境 kali、DVWA 二、步骤 首先打开kali,输入setoolkit 依次选择选项1-选项2-选项3-选项2 输入钓鱼网站的网址(默认为本地网址) 输入要克隆的网址URL 这里我的网址如图,将网址复制 然后模拟攻击场景,攻击者向受害者发送了一条钓鱼链接,此链接与DVWA的登陆页面完全一样,受害者点击之后并进行登陆信息 点击login之后,用户信息就被setool...

BeatRex的博客 2996

Qt event->buttons()与Qt event->button()

最近在调试QT程序时用到了buttons()和button()两个函数,顺便整理一下 Qt中buttons()和button()的区别,官方解析如下: Qt::MouseButton QMouseEvent::button() const 返回产生事件的按钮 Qt::MouseButton QMouseEvent::buttons() const 返回产生事件的按钮状态,函数返回当前按下的所有按钮...

liu_jiale1的博客 6124

时序基础模型Timer-S1:十亿参数如何革新时间序列预测

时间序列预测是数据分析与机器学习中的核心任务,旨在基于历史数据预测未来趋势。其原理在于捕捉数据中的趋势、周期性和季节性等时序依赖关系。这项技术的价值在于赋能业务决策,广泛应用于金融风控、能源管理、物联网监控和供应链优化等关键场景。传统方法依赖针对特定任务的专用模型,面临泛化能力弱和开发成本高的挑战。本文聚焦的时序基础模型,通过在海量跨领域数据上进行预训练,学习时序通用模式,并结合十亿级参数带来的强大容量,实现了性能的显著突破。这种范式转变,使得模型能够像“全科医生”一样,通过少量数据微调即可快速适应新任务,

weixin_29164843的博客 269

一步步教你使用 NVIDIA 推出的全新GPU加速求解器 cuOpt:解锁超高效率的求解体验

未完成

Linshaodan520的博客 869

Qt event->buttons()与Qt event->button()的区别

在上一篇文章用到了这两个函数,在这里做一下分析。 event->button() : 返回产生事件的按钮 event->buttons: 返回产生事件的按钮状态,函数返回当前按下的所有按钮,按钮状态可以是 Qt::LeftButton,Qt::RightButton,Qt::MidButton或运算组合 例如...

-却道天凉好个秋的博客 2040

3 ATK2(AUTOSAR OS)代码移植-目标硬件及编译环境简介

该部分介绍ATK2代码移植的目标硬件以及编译环境

xiaoduanduansad的博客 717

Qt之event()

前面的章节中我们曾经提到event()函数。事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。 如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。

一起摇摆_xianggy的专栏 1003

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Qt事件处理(四)——重写event()函数

目录目录 前言 Qt的事件分发过程 重新实现event 代码 总结前言根据视频看的事件处理,但是没有顺序,所以有点乱!不过理解起来也不麻烦!学习!分享!感谢!Qt的事件分发过程 在QApplication::exec()的事件循环中,会不断判断事件的产生,然后把产生的事件分派给对应的控件。比如,在QPushButton中产生了keyPressEvent()事件,这时候QApplication::e

simon曦的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: Qt学习之路(20): 事件接收与忽略
下一篇: Qt学习之路(22): 事件过滤器
flowingFire2012
博客等级 码龄14年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值