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

ASTRA Toolbox学习笔记-Python ASTRA Toolbox 是一个用于处理 X 射线相干散射和 X 射线传输成像的开源算法工具箱。本文档概述了该工具箱的基本概念。 阅读详情

相关推荐

基于Java的高校学生信息管理系统的设计与实现(论文+源码)

可以对本系统的数据进行良好的封装,Java可以对不想被访问的数据进行良好的隐藏,具备平台无关性,可移植,更加可靠与安全,具备多线程支持,进行网络交互更容易。它支持本系统的B/S模式。开发效益方面,本系统一旦开发成功并且面向社会,就会让大多数的学生教师体会到便利办公的乐趣,随之促进提高本系统的使用率和经济利润,所以在经济方面,对于零成本开发且高利润的学生管理系统是可行的。学生可以在学生端进行选课,查看自己的成绩,教师可以在教师端查看所任课程的选课情况,对学生成绩进行录入,对所任的课程进行结课等操作。

2402_82389843的博客 1092

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

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

^_^ 1631

一文详解AUTOSAR COM ComSignal结构体

ComSignalLength指定信号的长度,以字节为单位,影响数据的解析范围和精度。比如车速信号若为UINT16类型,ComSignalLength=16。这里需要注意必须ComSignalLength与ComSignalType匹配(比如FLOAT32类型需配置ComSignalLength=32),超出实际物理值范围时需配置缩放(Scaling)参数。ComSignalType定义信号的物理数据类型,决定如何解析原始字节数据。

menghuyouyou的博客 942

Qt事件的接受和忽略

Qt事件的接受和忽略

m0_73443478的博客 841

Python与.NET革命性互操作:PythonNet实现零门槛双向调用——深度解析与实战案例

跨语言调用实战指南:Python与.NET深度集成 摘要:本文详解Python与.NET双向互调技术,通过PythonNet和Python.Runtime实现高效跨语言协作。核心优势包括:无缝集成Python机器学习模块(如PaddleOCR)与.NET UI框架,内存直传提升90%数据效率,减少80%重复代码。内容涵盖:1)Python调用.NET类库的完整流程;2)C#动态加载Python脚本及环境配置要点;3)反射机制实现私有方法调用与泛型处理;4)性能优化技巧(类型缓存、NumPy数组转换);5)异

墨夶的博客 611

使用Google Earth Engine(GEE)的Python API,您可以将经纬度坐标转换为Landsat影像的路径/行号

使用Google Earth Engine(GEE)的Python API,您可以将经纬度坐标转换为Landsat影像的路径/行号。在这个示例中,我们选择了一个位于加利福尼亚州旧金山市附近的点,其经度为-122.084,纬度为37.421998。首先,我们需要导入必要的库和模块。接下来,我们定义一个函数,该函数将接收经度和纬度作为输入,并返回对应的Landsat路径/行号。最后,我们提取路径和行号的值,并将它们作为结果返回。现在,我们可以使用这个函数来获取特定点的Landsat路径/行号。

VwajAlgorithm的博客 348

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

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

laner__gg的博客 254

AI上推荐 之 AutoRec与Deep Crossing模型(改变神经网络的复杂程度)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 5666

状态机引擎选型

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

weixin_33795743的博客 659

最新Python爬虫实战(入门爬虫篇)——案例18:某气象局全国天气预报数据采集(详细爬虫思路截图 + 抓包动图演示+完整爬虫代码+详细注释)

本次案例针对某气象局天气预报网的静态HTML页面,实现了全国各地区天气数据的全自动化爬取,和之前案例17的动态接口爬虫不同,本次案例聚焦于静态页面的爬虫实现,覆盖了从抓包分析、请求模拟、数据解析到数据存储的完整爬虫流程,非常适合入门学习者巩固基础,核心知识点和实现要点总结如下:首先是页面分析的核心逻辑,静态HTML页面的数据爬取,核心在于通过浏览器开发者工具,完成完整的抓包分析和标签结构定位。

努力让自己发光,对的人才能迎着光而来 27万+

飞牛fnNAS存储模式RAID 5数据恢复

中介绍了fnNAS存储空间的几个模式,细心的网友应该能感受到,我是非常推崇RAID 5的。但我认为,一般人出现1块硬盘损坏后,就能够赶紧采取处理措施了,再高的容灾等级也无法满足这个用户的需求了。》就完成了飞牛NAS存储空间的说明,包括了如何创建、怎么选择空间模式、RAID 5 硬盘故障后的更换、系统更换/重装后数据盘的恢复等等。在VMware中新建虚拟机,安装好fnNAS后,再向虚拟机添加“已有硬盘”(这就是所谓崩溃虚拟机的数据盘),此时新的fnNAS出现提示。在“选择要添加的硬盘”中,选择刚添加硬盘。

dgnankai的专栏 3008

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

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

weixin_34275734的博客 364

B07:AI 时代怎么考核团队?我把 KPI 改了 5 版才找到答案

最后说一句掏心窝的话。绩效考核不是"管人"的工具,是"引导团队行为"的工具。你定什么指标,团队就会做什么行为。你定"AI 占比",团队就凑占比你定"效率提升",团队就挑软柿子你定"代码行数",团队就刷行数你定"工具使用率",团队就刷使用只有定"业务价值 + 工程质量 + 能力成长"三个维度的指标,团队才会真正关注长期价值。这套 KPI,我在我带的团队里跑了 6 个月,没有任何一个指标被"刷"出来。考核的是结果,不是过程。永远考核"创造了多少价值",永远不考核"用了多少 AI"。

刘一说的IT专栏 499

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

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

时间在哪 成就就在哪 1016

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

事件接收与忽略-20

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

啃骨头的小蚂蚁 410

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Qt6 for C++ 事件处理详解

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

weixin_43484713的博客 1688

Camera2Demo

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

【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、付费专栏及课程。

余额充值