QT事件过滤器eventFilter函数

Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理。

假设我们有一个CustomerInfoDialog控件,由一些QLineEdit控件组成。我们希望使用Space键得到下一个QLineEdit的输入焦点。一个最直接的方法是继承QLineEdit重写keyPressEvent()函数,当点击了Space键时,调用focusNextChild():

void MyLineEdit::keyPressEvent(QKeyEvent *event)
{if (event->key() == Qt::Key_Space) {focusNextChild();} else {QLineEdit::keyPressEvent(event);}
}

这个方法有一个最大的缺点:如果我们在窗体中使用了很多不同类型的控件(QComboBox,QSpinBox等等),我们也要继承这些控件,重写它们的keyPressEvent()。一个更好的解决方法是让CustomerInfoDialog监视其子控件的键盘事件,在监视代码处实现以上功能。这就是事件过滤的方法。实现一个事件过滤包括两个步骤:

  1. 在目标对象上调用installEventFilter(),注册监视对象。
  2. 在监视对象的eventFilter()函数中处理目标对象的事件。

注册监视对象的位置是在CustomerInfoDialog的构造函数中:

CustomerInfoDialog::CustomerInfoDialog(QWidget *parent): QDialog(parent)
{…firstNameEdit->installEventFilter(this);lastNameEdit->installEventFilter(this);cityEdit->installEventFilter(this);phoneNumberEdit->installEventFilter(this);
}

事件过滤器注册后,发送到firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit控件的事件首先到达CustomerInfoDialog::eventFilter()函数,然后在到达最终的目的地。
下面是eventFilter()函数的代码:

bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)
{if (target == firstNameEdit || target == lastNameEdit|| target == cityEdit || target == phoneNumberEdit) {if (event->type() == QEvent::KeyPress) {QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);if (keyEvent->key() == Qt::Key_Space) {focusNextChild();return true;}}}return QDialog::eventFilter(target, event);
}

首先,我们看是目标控件是否为QLineEdit,如果事件为键盘事件,把QEvent转换为QKeyEvent,确定被敲击的键。如果为Space键,调用focusNextChild(),把焦点交给下一个控件,返回true通知Qt已经处理了这个事件,如果返回false,Qt将会把事件传递给目标控件,把一个空格字符插入到QLineEdit中。
如果目标控件不是QLineEdit,或者事件不是Space敲击事件,把控制权交给基类QDialog的eventFilter()。目标控件也可以是基类QDialog正在监视的控件。(在Qt4.1中,QDialog没有监视的控件,但是Qt的其他控件类,如QScrollArea,监视一些它们的子控件)
Qt的事件处理有5中级别:

  1. 重写控件的事件处理函数:如重写keyPressEvent(),mousePressEvent()和paintEvent(),这是最常用的事件处理方法,我们已经看到过很多这样的例子了。
  2. 重写QObject::event(),在事件到达事件处理函数时处理它。在需要改变Tab键的惯用法时这样做。也可以处理那些没有特定事件处理函数的比较少见的事件类型(例如,QEvent::HoverEnter)。我们重写event()时,必须要调用基类的event(),由基类处理我们不需要处理的那些情况。
  3. 给QObject对象安装事件过滤器:对象用installEventFilter()后,所有达到目标控件的事件都首先到达监视对象的eventFilter()函数。如果一个对象有多个事件过滤器,过滤器按顺序激活,先到达最近安装的监视对象,最后到达最先安装的监视对象。
  4. 给QApplication安装事件过滤器,如果qApp(唯一的QApplication对象)安装了事件过滤器,程序中所有对象的事件都要送到eventFilter()函数中。这个方法在调试的时候非常有用,在处理非活动状态控件的鼠标事件时这个方法也很常用。
  5. 继承QApplication,重写notify()。Qt调用QApplication::nofity()来发送事件。重写这个函数是在其他事件过滤器处理事件前得到所有事件的唯一方法。通常事件过滤器是最有用的,因为在同一时间,可以有任意数量的事件过滤器,但是notify()函数只有一个。

许多事件类型,包括鼠标,键盘事件,是能够传播的。如果事件在到达目标对象的途中或者由目标对象处理掉,事件处理的过程会重新开始,不同的是这时的目标对象是原目标对象的父控件。这样从父控件再到父控件,知道有控件处理这个事件或者到达了最顶级的那个控件。
图7.2显示了一个键盘事件在一个对话框中从子控件到父控件的传播过程。当用户敲击一个键盘,时间首先发送到有焦点的控件上(这个例子中是QCheckBox)。如果QCheckBox没有处理这个事件,Qt把事件发送到QGroupBox中,如果仍然没有处理,则最后发送到QDialog中。
在这里插入图片描述

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

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

相关文章

信息哲学给哲学带来根本性革命了吗

来源&#xff1a;中国科学报 摘要&#xff1a;信息哲学乃是区别于所有其他哲学的一种元哲学或最高哲学。由于信息哲学首先是在哲学的最高范式&#xff08;“存在领域的划分”&#xff09;层面引发的变革&#xff0c;所以信息哲学实现了人类哲学的第一次根本性转向&#xff0c;从…

蜜蜂会算术吗

来源&#xff1a;中国科学报大脑袋或许并不是做数学题所必需的。蜜蜂通过了一项可能要求其进行加减的算术测试&#xff0c;尽管有人质疑这是否是真的。在测试中&#xff0c;研究人员首先向蜜蜂展示了含有1~5种形状的图片。图形颜色全部是蓝色或黄色&#xff0c;蓝色代表“加1”…

人工智能:主导下一轮科技创新红利

来源&#xff1a;中信证券分析师&#xff1a;许英博、陈俊云前言&#xff1a;人工智能(AI)将接棒移动互联网&#xff0c;成为下一轮科技创新红利的主要驱动力。透过丰富的数据采集(互联网和IoT)、更快的数据传输(5G)、更强大的数据运算处理(AI)&#xff0c;科技企业和传统企业将…

AI药物全球100领军人物:43%来自学界 美英顶级AI专家人数最多

来源&#xff1a;网易智能近日&#xff0c;深度知识分析公司Deep Knowledge Analytics从最初的500名优秀候选人中&#xff0c;挑选出了“药物发现和先进医疗领域100大AI领军人物”。除非有新的“AI寒冬”来袭&#xff0c;并席卷科学探索领域&#xff0c;否则这100位科学家的工作…

机器学习算法集锦:从贝叶斯到深度学习及各自优缺点

来源&#xff1a;图灵人工智能目录正则化算法&#xff08;Regularization Algorithms&#xff09;集成算法&#xff08;Ensemble Algorithms&#xff09;决策树算法&#xff08;Decision Tree Algorithm&#xff09;回归&#xff08;Regression&#xff09;人工神经网络&#x…

MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本

介绍MongoDB支持的一些高级功能&#xff1a; 数据库命令 固定大小的集合 GridFS存储大文件 MongoDB对服务端JavaScript的支持 数据库命令 命令的原理 MongoDB中的命令其实是作为一种特殊类型的查询来实现的&#xff0c;这些查询针对$cmd集合来执行。runCommand仅仅是接受命令文…

汽车与智能家居互联时代 语音控制很关键

来源&#xff1a; I CTA编译&#xff1a;网易智能 nariiy摘要&#xff1a;对于大多数人而言&#xff0c;最昂贵的两个物件是家和汽车。如今&#xff0c;技术将这二者联系在一起&#xff0c;并互为延伸。在不断加速发展的趋势中&#xff0c;智能家居和联网汽车正在融合&#xff…

[问题解决]同时显示多个Notification时PendingIntent的Intent被覆盖?

情况是这样的&#xff0c;使用NotificationManager触发多个Notification: Java代码 private Notification genreNotification(Context context, int icon, String tickerText, String title, String content, Intent intent){ Notification notification new Notifi…

【工业革命】第四次工业革命:自主经济的崛起

来源&#xff1a;产业智能官摘要&#xff1a;数据是新的资源&#xff0c;数据的处理和应用将带动第四次工业革命。随着大数据、云计算、物联网、人工智能、区块链等技术的崛起&#xff0c;很多人都说第四次工业革命即将到来。第四次工业革命到底指的是什么&#xff1f;应该如何…

2019年大数据发展将走向何方

来源&#xff1a;网络大数据近日&#xff0c;包括CCF(中国计算机学会)大数据专家委员会、IDC公司(Internet Data Center 互联网数据中心)和Gartner公司等多家国内外知名信息技术研究机构均发布报告&#xff0c;对2019年乃至未来若干年的大数据产业发展趋势做出预测&#xff0c;…

AI人必看!89页全网最全清华知识图谱报告

来源&#xff1a;智东西摘要&#xff1a;谷歌冲锋&#xff0c;淘宝猛追&#xff0c;这个AI秘密武器强在哪&#xff1f;知识图谱&#xff08;Knowledge Graph&#xff09;是人工智能的重要分支技术&#xff0c;它在2012年由谷歌提出&#xff0c;成为建立大规模知识的杀手锏应用&…

人机融合智能的现状与展望

来源&#xff1a;人机与认知实验室作者&#xff1a;刘伟 苌凯旋摘要&#xff1a;本文对人机融合智能的概念、应用、发展将面临的关键问题以及未来发展的方向进行简要介绍。1 引言1.1 现有人工智能的不足与挑战人工智能&#xff08;AI&#xff09;的概念于1956年的达特蒙斯学院暑…

Unity自带网络功能——NetworkView组件、Serialize、RPC

Unity拥有大量的第三方插件&#xff0c;专门提供了对网络功能的支持。可是&#xff0c;大部分开发人员第一次接触到的还是Unity自带的网络功能&#xff0c;也就是大家常常说到的Unity Networking API。这些API是借助于组件NetworkView发挥作用的&#xff0c;而它能够简化开发人…

Science:人工智能的发展离不开神经科学,先天结构或是下一个方向

来源&#xff1a;Science编译&#xff1a;机器之心摘要&#xff1a;人工智能从神经科学领域吸收了大量养分&#xff0c;并由此催生了深度学习和强化学习等智能处理方法。以色列魏茨曼科学研究学院计算机科学系教授 Shimon Ullman 相信神经科学还能为人工智能发展提供进一步的助…

Ubuntu20.04 及深度学习环境anaconda、cuda、cudnn、pytorch、paddle2.3安装记录

学习目标&#xff1a; Ubuntu20.04下装好torch、paddle深度学习环境。 选择的版本环境是 &#xff1a;最新的nvidia驱动、cuda 11.1 、cudnn v8.1.1&#xff0c;下面会说为啥这么选。 学习内容&#xff1a; 1. Ubuntu20.04仓库换源 本节参考Ubuntu 20.04 Linux更换源教程 2…

NSIS脚本语言安装与编译

NSIS是什么 当项目中需要把安装包发给客户时&#xff0c;不能直接发送release文件&#xff0c;需要把release文件压缩打包&#xff0c;这时就可以用到NSIS工具&#xff0c;NSIS工具可以进行包装&#xff0c;使用时需要下载&#xff1a; 编译环境&#xff1a;nullsoft scriptab…

AI 的寒冬将来临

来源&#xff1a;云头条深度学习处于所谓的AI革命的前沿至今已有好几年&#xff1b;许多人过去认为&#xff0c;深度学习是神奇的“银弹”&#xff0c;会把我们带到技术奇点&#xff08;general AI&#xff09;的奇妙世界。许多公司在2014年、2015年和2016年纷纷下豪赌&#xf…

Libcurl安装与HelloWorld

Windows系统下源代码下载编译、安装方式如下&#xff1a; https://blog.csdn.net/fxbjye/article/details/89152849 编译后得到库文件&#xff0c;把这两个文件复制到项目文件中&#xff0c; 修改项目文件的属性&#xff0c; 修改附加依赖项&#xff1a; 输入代码&#xff1…

信息论之父是如何将世界数字化的?

来源&#xff1a;CSDN编译&#xff1a;弯月机械鼠闯迷宫在 20 世纪 50 年代早期的一段视频中&#xff0c;贝尔实验室的科学家克劳德香农&#xff08;Claude Shannon&#xff09;展示了他的一项新发明&#xff1a;一只名为 Theseus 的机械鼠&#xff08;看起来需要上发条&#x…

奇点、技术失控与技术启示录

来源&#xff1a;资本实验室回顾过去&#xff0c;我们可以看到历史上各个时期涌现出的众多超越时代的新公司、新产品、新思维和新模式。尽管绝大多数创新产品最终都失败了&#xff0c;但先行者们致力于要解决所在时代各种问题和困难的精神&#xff0c;却影响着下一代的技术进步…