Qt学习之路(20): 事件接收与忽略

QT事件与事件处理 被拖动的组件称为拖动点,接受拖放操作的组件称为放置点。重新实现event函数首先要判断事件类型,选择要处理的事件进行处理,如果不处理使用ignore()函数忽略该事件,该事件被忽略后会由父容器组件的event函数再次处理。事件过滤器是QObject提供的一种处理事件的方法,将一个对象的事件委托给另一个对象来监视并处理,监视的对象就是事件过滤器。QWidget重新实现了event函数,针对典型类型的事件定义了专门处理的函数,命名为(典型事件+event)。自生事件,分布事件是异步的,发送事件是同步的。 阅读详情

本章内容也是关于Qt事件。或许这一章不能有一个完整的例子,因为对于事件总是感觉很抽象,还是从底层上理解一下比较好的吧!

前面说到了事件的作用,下面来看看我们如何来接收事件。回忆一下前面的代码,我们在子类中重写了事件函数,以便让这些子类按照我们的需要完成某些功能,就像下面的代码:

void MyLabel::mousePressEvent(QMouseEvent *  event)
{
         if( event->button() == Qt::LeftButton) {
                 // do something
        }  else {
                QLabel::mousePressEvent( event);
        }
}


上面的代码和前面类似,在鼠标按下的事件中检测,如果按下的是左键,做我们的处理工作,如果不是左键,则调用父类的函数。这在某种程度上说,是把事件向上传递给父类去响应,也就是说,我们在子类中“忽略”了这个事件。

我们可以把Qt的事件传递看成链状:如果子类没有处理这个事件,就会继续向其他类传递。其实,Qt的事件对象都有一个accept()函数和ignore()函数。正如它们的名字,前者用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;后者则告诉Qt,事件处理函数“忽略”了这个事件,需要继续传递,寻找另外的接受者。在事件处理函数中,可以使用isAccepted()来查询这个事件是不是已经被接收了。

事实上,我们很少使用accept()和ignore()函数,而是想上面的示例一样,如果希望忽略事件,只要调用父类的响应函数即可。记得我们曾经说过,Qt中的事件大部分是protected的,因此,重写的函数必定存在着其父类中的响应函数,这个方法是可行的。为什么要这么做呢?因为我们无法确认父类中的这个处理函数没有操作,如果我们在子类中直接忽略事件,Qt不会再去寻找其他的接受者,那么父类的操作也就不能进行,这可能会有潜在的危险。另外我们查看一下QWidget的mousePressEvent()函数的实现:

void QWidget::mousePressEvent(QMouseEvent * event)
{
         event->ignore();
         if ((windowType() == Qt::Popup)) {
                 event->accept();
                QWidget* w;
                 while ((w = qApp->activePopupWidget()) && w !=  this){
                        w->close();
                         if (qApp->activePopupWidget() == w)  // widget does not want to dissappear
                                w->hide();  // hide at least
                }
                 if (!rect().contains( event->pos())){
                        close();
                }
        }
}


请注意第一条语句,如果所有子类都没有覆盖mousePressEvent函数,这个事件会在这里被忽略掉,这暗示着这个组件不关心这个事件,这个事件就可能被传递给其父组件。

不过,事情也不是绝对的。在一个情形下,我们必须使用accept()和ignore()函数,那就是在窗口关闭的时候。如果你在窗口关闭时需要有个询问对话框,那么就需要这么去写:

void MainWindow::closeEvent(QCloseEvent *  event)
{
         if(continueToClose()) {
                 event->accept();
        }  else {
                 event->ignore();
        }
}

bool MainWindow::continueToClose()
{
         if(QMessageBox::question( this,
                                            tr( "Quit"),
                                            tr( "Are you sure to quit this application?"),
                                            QMessageBox::Yes | QMessageBox::No,
                                            QMessageBox::No)
                == QMessageBox::Yes) {
                 return  true;
        }  else {
                 return  false;
        }
}


这样,我们经过询问之后才能正常退出程序。

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

Qt + windows + Linux+QtInstallerFramework打包教程 本文介绍了使用Qt Installer Framework在Windows和Linux系统下打包Qt应用程序的完整教程。Windows部分详细说明了从下载安装框架、配置环境变量、生成release版本,到创建安装包目录结构和修改配置文件的完整流程。Linux部分则重点讲解了环境变量设置、桌面应用配置(.desktop文件)以及两种打包方案:一种使用linuxdeployqt生成AppImage文件,另一种采用类似Windows的安装包方式。教程提供了关键配置文件(config.xml、package.xml 阅读详情

相关推荐

反相器(inverter)和缓冲器(buffer)---附加与非门原理图

下面是对反相器(Inverter)和缓冲器(Buffer)从面积、驱动能力、时序等多个角度的详细对比,列出的是一般情况下的比较,具体情况可能会受到工艺节点、设计库和特定设计要求的影响。缓冲器(Buffer)是数字电路中常见的逻辑门之一,用于增强信号的驱动能力,而不改变信号的逻辑状态。如下图所示的CMOS反相器,由一个NMOS和PMOS组成,栅端gate相连作为输入端Vin,漏端相连作为输出端Vout,NMOS的源端接地,PMOS的源端接电源VDD.与反相器不同,缓冲器的输出与输入保持相同的逻辑状态。

hzmscut的博客 1万+

Qt、事件的发送和接收以及自定义用户事件

Qt的事件所有的父类是:QEventQt事件类型:QEvent::Type其中,可供用户自定义使用的事件ID为1000~65535。自定义事件方法也比较简单,继承QEvent并将自定义类型传入即可。

^_^ 1631

【运筹学】什么是基变量?对于线性规划问题中“基”概念的理解(3月3日学习笔记)

在学习《线性规划与目标规划》的过程中,课程的主讲老师郭韧给出了对于基概念的定义如下图 图片来源:运筹学(中国大学mooc网) 由此我产生了几个疑惑:1.如何理解B是线性规划问题的一个基?2.为什么说最多有CnmC_n^mCnm​个基呢?     1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基? 在回答第一个...

纸羊同学的博客 3万+

Qt事件的接受和忽略

Qt事件的接受和忽略

m0_73443478的博客 841

三种 绘制奈奎斯特曲线 的方法

如何绘制Nyquist曲线 提供三种绘制方法,其中使用最广泛的是概略图绘制方法 ①解析法绘制 ②概略图法绘制 ③MATLAB绘制

weixin_46664967的博客 6万+

从OVITO可视化到LAMMPS计算:ATOMSK堆垛层错模型的全流程避坑指南

本文提供了一份从ATOMSK建模、OVITO可视化诊断到LAMMPS计算的堆垛层错模型全流程实战指南。重点解析了构建“计算友好”模型的核心矛盾,并详细演示了如何通过添加真空层、原子包裹和能量最小化等关键步骤,规避周期性边界条件带来的非物理相互作用,确保广义层错能计算的可靠性与可复现性。

v4w5x6的博客 266

QT事件处理-事件机制(一)

1、关于事件处理的相关API: 事件机制是信号与槽的补充,信号与槽机制是用来对象之间的通讯。信号与槽是对事件机制的高级关联,事件机制更偏底层(远离用户)。 一个应用程序对应一个QApplication对象。 先产生一个消息(鼠标、键盘时间等),将所有消息放入消息队列。第一个接受到消息的是操作系统,操作系统会将消息分发到对应的应用程序“消息队列”中。 一个应用程序有两个队列,存放不同类型的事件消息。事件会被包装成QEvent,主要是将事件接收者和事件对象(单击、右击等)传递给QAppl..

laner__gg的博客 254

通过轻量级图像增强Transformer (IAT) 提升YOLOv8在低光环境下的检测性能

随着深度学习和计算机视觉的快速发展,目标检测模型在各个领域中的应用不断扩展,特别是在低照度环境下的视觉任务。YOLOv8作为当前最先进的目标检测模型之一,在高亮度和良好照明条件下表现出色,但在低照度环境下的性能存在一定的不足。为了解决这一问题,我们提出了一种轻量级的低照度图像增强网络(IAT)来改进YOLOv8的暗光检测能力。本篇文章将深入探讨这一创新改进,并附带代码实现,帮助大家更好地理解这一技术的应用和效果。

博客 1214

状态机引擎选型

状态机引擎选型 date: 2017-06-19 15:50:18 概念 有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在电商场景(订单、物流、售后)、社交(IM消息投递)、分布式集群管理(分布式计算平台任务编排)等场景都有大规模的使用。 状态机的要素状...

weixin_33795743的博客 659

基于IEEE39节点系统的风力发电机组并网改造与稳定性研究

本文研究了基于IEEE39节点系统的风力发电机组并网改造与稳定性问题。首先将系统工作频率从60Hz转换为50Hz,并对同步发电机、变压器、线路和负荷参数进行相应调整。随后将30、32、34、37号节点的同步发电机替换为不同容量的永磁同步发电机(PMSG)和双馈感应发电机(DFIG),详细建立了两种风电机组的数学模型和控制策略。通过Simulink仿真验证,改造后的系统能够稳定运行并满足并网要求。研究成果为大规模风电并网系统仿真提供了参考,对提高电力系统可再生能源消纳能力具有重要意义。

huanghm88的专栏 109

运维系列【仅供参考】: Windos10和Windos11 配置intel网卡vlan的方法

Windos10和Windos11 配置intel网卡vlan的方法

weixin_54626591的博客 476

工业嵌入式非易失存储选型:MRAM替换SRAM与Flash的实战指南

在工业嵌入式系统中,非易失性存储器的选型直接影响数据可靠性与维护成本。传统方案如SRAM加电池或SPI Flash存在数据丢失、写入延迟和擦写寿命有限等痛点。MRAM(磁性随机存储器)基于磁性隧道结原理,兼具非易失性、SRAM级读写速度和无限擦写寿命,成为工业数据采集、参数存储和黑匣子日志记录的理想选择。以Everspin MR25H40CDF与STM32F767ZG为例,通过SPI接口实现高速读写,需注意模式配置、片选时序、DMA对齐及宽温时序余量。合理应用可显著提升系统可靠性,降低BOM成本,适用于环境

weixin_34275734的博客 364

从 0 到 1 玩转小智 AI 智能音箱:开发教程 + 实战项目全攻略

如果说 MCP 是工具箱,那 SDK 就是 “技能模板”—— 小智音箱的自定义技能本质是 “意图识别 + 逻辑响应” 的组合,就像给嵌入式设备写驱动程序,只要按规则调用接口,就能实现各种功能。小智 AI 音箱的开发门槛并不高,核心是利用 MCP SDK 封装好的接口,结合嵌入式开发的 “硬件对接 + 逻辑编程” 思维,就能实现各种自定义功能。从环境搭建到技能开发,再到实战项目落地,每一步都是对 “软件控制硬件” 的实践 —— 而这正是嵌入式开发的核心魅力。

weixin_42300449的博客 1193

Qt 之路 (20)—事件的接收与忽略

本章内容也是关于Qt事件。或许这一章不能有一个完整的例子,因为对于事件总是感觉很抽象,还是从底层上理解一下比较好的吧! 前面说到了事件的作用,下面来看看我们如何来接收事件。回忆一下前面的代码,我们在子类中重写了事件函数,以便让这些子类按照我们的需要完成某些功能,就像下面的代码: void MyLabel::mousePressEvent(QMouseEvent * event) { if(

时间在哪 成就就在哪 1016

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

事件接收与忽略-20

本章内容也是关于Qt事件。或许这一章不能有一个完整的例子,因为对于事件总是感觉很抽象,还是从底层上理解一下比较好的吧! 前面说到了事件的作用,下面来看看我们如何来接收事件。回忆一下前面的代码,我们在子类中重写了事件函数,以便让这些子类按照我们的需要完成某些功能,就 像下面的代码:void MyLabel::mousePressEvent(QMouseEvent * event ) {         if (event ->button() == Qt::LeftButton) {

啃骨头的小蚂蚁 410

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Qt6 for C++ 事件处理详解

Qt 的事件系统是其核心机制之一,用于处理应用程序中的各种交互和系统消息。事件系统基于**事件对象(QEvent)和事件循环(Event Loop)**构建,允许应用程序对用户输入、窗口系统请求、定时器超时等做出响应。事件对象封装了事件的具体信息,事件传播机制确保事件首先传递给目标对象,若未被处理,会向上传递给父对象。事件过滤器允许一个对象监视另一个对象的事件,而事件循环则确保异步事件按顺序处理。常见事件类型包括输入事件、窗口事件和定时器事件。

weixin_43484713的博客 1688

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Qt开发】事件与信号/事件过滤器

例如:一个窗口可以作为其界面上的QLabel组件的事件过滤器,派发给QLabel组件的事件由窗口去处理,这样就不需要重新定义一个标签类啦。如果有事件就派发给接收事件的对象去处理,事件循环还可以把相同的事件进行合并发送给接收事件的对象去处理。注意,应用程序的事件循环只会处理自主事件和发布事件,而不会处理发送事件,因为发送事件是以同步模式运行的。每一个事件都有唯一的的事件类型,也有对应的事件类,有的事件类可以处理多种类型的事件。参数e就是事件对象,通过e->type()来判断事件的类型,调用对应的处理函数。

qq_53505979的博客 1330

Qt研发易忽略问题整理(一)

目的: 整理Qt在研发过程中易忽略的问题。 1.std::map 与QMap再插入重复键时 前者会忽略插入的值,后者会更新值。 QMapintmap; intmap[10]=“10”,会插入键值(10,10) 2. QTreeWidget中有一个invisibleRootItem其子节点是顶级的topLevelItem 3.数字与字符转换 QStringLiteral(“XXX%1”).arg(a...

liunanya的博客 950
上一篇: Qt学习之路(19): 事件(event)
下一篇: Qt学习之路(21): event()
flowingFire2012
博客等级 码龄14年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值