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;从…

运行yum时出现错误,缺失libsasl2.so.2文件

运行yum时出现错误&#xff0c;缺失libsasl2.so.2文件 [rootlocalhost /]# yum repolist There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:libsasl2.so.2: cannot open shared object file: No such fil…

蜜蜂会算术吗

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

QT中的QTableView+QTableWidget

该类是显示表格数据的&#xff0c;像Excel一样&#xff0c; 参考&#xff1a;https://blog.csdn.net/qq769651718/article/details/79357938 QTableWidget控件参考&#xff1a; https://blog.csdn.net/alan00000/article/details/7951428 //QTableWidget的常用方法 tableWidg…

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

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

mysql 修复表和优化表

REPAIR TABLE table_name 修复表 OPTIMIZE TABLE table_name 优化表转载于:https://www.cnblogs.com/lvdongjie/p/4182162.html

QT的QStackedLayout

QStackedLayout栈式布局管理器管理的所有组件在垂直于屏幕的方向上&#xff0c;每次只显示一个组件界面。 参考&#xff1a;https://www.2cto.com/kf/201605/513676.html https://blog.51cto.com/9291927/1871918

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

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

初探弹出层的实现原理

首先用几句话来描述一下实现过程&#xff0c;好有个思路嘛^^&#xff1a;&#xff08;1&#xff09;先创建一个div层将整个屏幕罩住&#xff08;所谓的遮罩层&#xff09;&#xff0c;可设置该层的属性&#xff0c;例如透明度&#xff08;2&#xff09;在遮罩层内创建div来展示…

C++四种类型转换

参考&#xff1a;https://www.cnblogs.com/hyd5648/p/3921501.html

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

来源&#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仅仅是接受命令文…

visual assist安装方法

参考&#xff1a;https://blog.csdn.net/yychentracy/article/details/82809888

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

来源&#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…

QT中的QButtonGroup

QButtonGroup类可以实现同一组的按钮的互斥操作&#xff0c; 比如当点击到某一个按钮checked时&#xff0c;其他按钮恢复到默认状态&#xff0c; 具体见 https://blog.csdn.net/naibozhuan3744/article/details/82146755 和&#xff1a;https://www.cnblogs.com/ranson7zop/p/…

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

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

mysql分表方法实现

一般来说&#xff0c;当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了&#xff0c;这次我来详细说说分表的一些方法。目前我所知道的方法都是MYISAM的&#xff0c;INNODB如何做分表并且保留事务和外键&#xff0c;我还不是很了解。 首 先&#xff0c;我们需…

QT中的QGridLayout布局

QGridLayout布局参考&#xff1a; https://blog.csdn.net/mynameislinduan/article/details/77893298

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

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