Qt事件过滤器

1. 事件过滤器

void QObject::installEventFilter(QObject *filterObj)
bool eventFilter(QObject *obj, QEvent *event);

        filterObj表示事件筛选器对象,它接收发送到此QObject对象(安装事件过滤器的部件对象)的所有事件。筛选器可以停止事件(返回true),也可以将事件转发给此QObject对象(返回false)。事件过滤器filterObj通过它的eventFilter()函数接收事件。

//举例说明:
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);lineEdit = new MyLineEdit(this);    //在部件A建立部件B,部件A即B的父部件lineEdit->move(100, 100);lineEdit->installEventFilter(this);   // 在Widget上为lineEdit安装事件过滤器
}
/** 此时filterObj为this:表示窗口部件Widget。Widget接收发送到lineEdit对象的全部事件。* 可以这样理解:一个部件安装了事件筛选器对象是其父部件的事件过滤器,则其父部件可以接收其全部事件。*/

2. 接收事件

        在Qt中,事件过滤器的eventFilter函数返回值表示该事件是否被事件过滤器拦截,即是否停止事件的传递。返回值是一个布尔类型的值:

        1)当返回true时,表示事件已被过滤器拦截,不会传递给被监听的对象进行处理;

        2)当返回false时,事件会继续传递给被监听的对象进行处理。

        3)返回给基类进行处理,例:return QObject::eventFilter(obj, event);可以理解为:没有条件的递归,即死循环递归调用自己)。

按F1打开帮助文档

注意:

        1)eventFilter函数一般会被重写,返回true/false是程序员自己在程序里手动添加的;

        2)return QObject::eventFilter(obj, event)具体值,其实也是每次调用自己,根据是否有手动添加的true/false来决定的。默认不过滤,返回false.

3. 事件的传递(通过4实例中的键盘按下事件举例)

4. 实例

//mylineedit.cpp
#include "mylineedit.h"
#include <QKeyEvent>
#include <QDebug>MyLineEdit::MyLineEdit(QWidget *parent) :QLineEdit(parent)
{}void MyLineEdit::keyPressEvent(QKeyEvent *event) // 键盘按下事件
{qDebug() << tr("MyLineEdit键盘按下事件");QLineEdit::keyPressEvent(event);          // 执行QLineEdit类的默认事件处理//事件是先传递给指定窗口部件的,这里确切的说应该是先传递给获得焦点的窗口部件的。但是如果该部件忽略掉该事件,那么这个事件就会传递给这个部件的父部件。event->ignore();                          // 忽略该事件
}bool MyLineEdit::event(QEvent *event)  // 事件
{if(event->type() == QEvent::KeyPress)qDebug() << tr("MyLineEdit的event()函数");return QLineEdit::event(event);   // 执行QLineEdit类event()函数的默认操作
}
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mylineedit.h"
#include <QKeyEvent>
#include <QDebug>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);lineEdit = new MyLineEdit(this);    //在部件A建立部件B,部件A即B的父部件lineEdit->move(100, 100);lineEdit->installEventFilter(this);   // 在Widget上为lineEdit安装事件过滤器
}Widget::~Widget()
{delete ui;
}void Widget::keyPressEvent(QKeyEvent *event)
{Q_UNUSED(event);qDebug() << tr("Widget键盘按下事件");
}bool Widget::eventFilter(QObject *obj, QEvent *event) // 事件过滤器
{if(obj == lineEdit){              // 如果是lineEdit部件上的事件if(event->type() == QEvent::KeyPress){qDebug() << tr("Widget的事件过滤器");}}return QWidget::eventFilter(obj, event);
}

 测试结果:

总结:

1)只有installEventFilter,没有eventFilter,事件依旧不会被提前捕获接收。必须成对存在。

2)没有event 事件传递依旧成立。

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

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

相关文章

SpringCloud-Gateway解决跨域问题

Spring Cloud Gateway是一个基于Spring Framework的微服务网关&#xff0c;用于构建可扩展的分布式系统。在处理跨域问题时&#xff0c;可以通过配置网关来实现跨域资源共享&#xff08;CORS&#xff09;。要解决跨域问题&#xff0c;首先需要在网关的配置文件中添加相关的跨域…

(六)激光线扫描-三维重建

本篇文章是《激光线扫描-三维重建》系列的最后一篇。 1. 基础理论 1.1 光平面 在之前光平面标定的文章中,已经提到过了,是指 激光发射器投射出一条线,形成的一个扇形区域平面就是光平面。 三维空间中平面的公式是: A X + B Y + C Z + D = 0 A X+B Y+C Z+D=0

矿产达人小程序修复前端

应用介绍 本文来自&#xff1a;矿产达人小程序修复前端 - 源码1688 矿产达人小程序&#xff1a; 矿产小游戏小程序是一款以矿产资源为主题的休闲娱乐游戏。以下是该小程序的主要功能特点&#xff1a; 游戏画面精美&#xff1a;小程序采用卡通化的设计风格&#xff0c;画面色…

程序媛的mac修炼手册-- 小白入门Java篇

最近因为要用CiteSpace做文献综述&#xff0c;间接接触Java了。所以&#xff0c;继Python、C之后&#xff0c;又要涉猎Java了。刺激&#xff01;&#xff01; 由于CiteSpace与Java要求版本高度匹配&#xff0c;有个匹配详情明天为大家讲解。总之&#xff0c;我的Java之旅开始于…

我们有在线社区啦!快来加入一起玩儿~

&#x1f64c;大噶好呀&#xff01;春节假期转瞬即逝&#xff0c;小陈已经正式开工啦&#xff5e;虽然不知道大家啥时候收假&#xff0c;但是 RTE 开发者社区㊗️诸位&#xff1a; &#x1f9e7;&#x1f432;&#x1f647;2024 开工大吉&#x1f647;&#x1f432;&#x1f9…

企业级SAS盘SSDPM1643a PM1653 Nytro 2050 KPM71VUG3T20固态硬盘

今天给大家介绍一下KIOXIA铠侠PM7系列均衡性硬盘KPM71VUG3T20 存储容量&#xff1a;3200 GB 接口类型&#xff1a;SAS-4 读取速度&#xff1a;4,200 MB/s 写入速度&#xff1a;3,650 MB/s 工作温度&#xff1a;0 ℃ to 75 ℃ 储存温度&#xff1a;40 ℃ to 85 ℃ MTTF&a…

投放效果难衡量?如何精准提升ROI

在当前的移动互联网环境下&#xff0c;App获客和转化成为了许多应用面临的一大难题。随着广告买量成本的不断攀升&#xff0c;用户增长遭遇了瓶颈。同时&#xff0c;由于移动环境广告标识难以完整获取&#xff0c;投放效果的衡量也变得更加困难。那么&#xff0c;如何打破这一困…

高录用快见刊【最快会后两个月左右见刊】第三届社会科学与人文艺术国际学术会议 (SSHA 2024)

第三届社会科学与人文艺术国际学术会议 (SSHA 2024) 2024 3rd International Conference on Social Sciences and Humanities and Arts *文章投稿均可免费参会 *高录用快见刊【最快会后两个月左右见刊】 重要信息 会议官网&#xff1a;icssha.com 大会时间&#xff1a;202…

Shell变量类型和运算符

一、Shell变量类型 1、变量类型 Shell的3种变量&#xff1a; &#xff08;1&#xff09;局部变量&#xff1a;除了本地变量外&#xff0c;还有shell脚本中定义的变量。 &#xff08;2&#xff09;全局变量&#xff1a;和局部变量相对。比如环境变量就是一种全局变量。 &am…

MaxScale实现mysql8读写分离

MaxScale 实验环境 中间件192.168.150.24MaxScale 22.08.4主服务器192.168.150.21mysql 8.0.30从服务器192.168.150.22mysql 8.0.30从服务器192.168.150.23mysql 8.0.30 读写分离基于主从同步 1.先实现数据库主从同步 基于gtid的主从同步配置 主库配置 # tail -3 /etc/my.…

刷新多个SOTA!最新Mamba魔改版本超越transformer,GPU内存消耗减少74%

因模型规模的扩展和需要处理的序列不断变长&#xff0c;transformer逐渐出现计算量激增、计算效率下降等问题。为克服这些缺陷&#xff0c;研究者们提出了Mamba。 Mamba是一种创新的线性时间序列建模方法&#xff0c;它结合了递归神经网络&#xff08;RNN&#xff09;和卷积神…

[面试] InnoDB中如何解决幻读?

幻读是通过 MVCC 机制来解决的, MVCC 类似于一种乐观锁的机制&#xff0c;通过版本的方式来区分不同的并发事务&#xff0c;避免幻读 问题! 什么是幻读? 事务A前后两次读取同一个范围的数据&#xff0c;在事务A两次读取的过程之间&#xff0c;事务B新增了数据&#xff0c;导致…

星际修仙之剑胆琴心

剧名&#xff1a;《星际修仙之剑胆琴心》 类型&#xff1a;科幻修仙爱情剧 故事大纲&#xff1a; 在遥远的未来&#xff0c;人类文明已经发展到星际时代&#xff0c;科技与修仙相结合&#xff0c;形成了一种全新的文明形态。在这个时代&#xff0c;修仙者不再局限于传统的修炼方…

图文说明Linux云服务器如何更改实例镜像

一、应用场景举例 在学习Linux的vim时&#xff0c;我们难免要对vim进行一些配置&#xff0c;这里我们提供一个vim插件的安装包&#xff1a; curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o./install.sh && bash ./install.sh 但是此安装包…

跳槽前应该做好哪些准备?

第一次求职也好&#xff0c;还是换工作也罢&#xff0c;都需要有严谨的考虑。对于已经工作上班的朋友来说&#xff0c;切不可轻易地辞掉工作&#xff0c;想要跳槽&#xff0c;一定要三思而后行&#xff0c;有一个周密的部署。跳槽有好处&#xff0c;也有弊端&#xff0c;频繁的…

【学网攻】 第(30)节 -- 综合实验三

系列文章目录 目录 系列文章目录 文章目录 前言 一、综合实验 二、实验 1.引入 实验目标 实验设备 实验拓扑图 实验配置 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节…

探讨导致vcruntime140_1.dll无法继续执行代码的原因和解决办法

在使用电脑过程中&#xff0c;我们偶尔会遇到一些令人不悦的错误提示&#xff0c;如"vcruntime140_1.dll丢失"。这个错误提示可能会给我们带来诸多困扰&#xff0c;阻碍我们正常地进行操作。本文将详细探讨导致"vcruntime140_1.dll丢失"错误的原因&#xf…

Java基于SSM+JSP的超市进销库存管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

开源图表库Echarts 简介与基本使用

ECharts 是一个使用 JavaScript 实现的开源可视化图表库&#xff0c;由百度团队开发。它提供了丰富的图表类型&#xff0c;如折线图、柱状图、饼图、地图、雷达图等&#xff0c;并且可以轻松地与其他前端框架和库集成。ECharts 的设计目的是为了满足复杂数据的可视化需求&#…

flutter开发实战-StreamBuilder使用介绍及实例

flutter开发实战-StreamBuilder使用介绍及实例 StreamBuilder是一个Widget&#xff0c;它依赖Stream来做异步数据获取刷新widget。 一、Stream Stream是一种用于异步处理数据流的机制&#xff0c;它允许我们从一段发射一个事件&#xff0c;从另外一段去监听事件的变化.Strea…