Qt 事件过滤器 - EventFilter

2023-11-10 18:59

本文主要是介绍Qt 事件过滤器 - EventFilter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事件过滤器,见名之意,就是将事件过滤一遍,将不需要的事件都清除掉,剩下需要的事件进行操作。

可能讲得不是很透彻,那就看下图,就很明白了:
在这里插入图片描述

原本事件应该直接发送给“组件对象”,但是现在却先将事件发送给“过滤器对象”,经过过滤的事件再发给“组件对象”。

如上,可以将事件过滤器这么理解,但是本人并不是这样理解的。
个人觉得事件过滤器的一个重要用法就是给那些没有鼠标事件和键盘事件的部件添加这些事件操作。

例如,label部件没有鼠标事件,当我们有这方面的项目需求时,就可以使用事件过滤器;SpinBox没有键盘事件,当我们有这方面的项目需求时,就可以使用事件过滤器。

事件过滤器的操作:

  1. 首先给需要添加事件过滤器的部件注册监听对象
    对象名->installEventFilter(true);

  2. 重写eventFilter(QObject *obj, QEvent *event)函数进行处理。


写一个小例子:
在项目ui文件上托两个label部件和一个spinBox部件。
并准备一张图片。

最后实现的效果是:
鼠标单击图片,然后在label中显示是鼠标那个键点击了图片;
当按下键盘空格键,spinBox部件显示值0,放开部件显示99.
在这里插入图片描述

根据需要添加头文件:
#include <QMouseEvent> // 鼠标事件头文件
#include <QKeyEvent> // 键盘事件头文件


写代码

首先将部件进行注册
指定整个窗体为监视事件的对象

ui.spinBox->installEventFilter(this);
ui.label->installEventFilter(this);

为一个label设置图片吧

ui.label->setPixmap(QPixmap(QString("fly1.png")));
ui.label->setFixedSize(ui.label->pixmap()->size());

然后重写eventFilter进行操作

首先使用参数obj进行与绑定的控件对象进行判断,是否与其相等;然后在使用参数event->type()的返回值与枚举鼠标或者键盘进行判断;最后将event转换为鼠标事件对象或者键盘对象事件,就可以进行操作了。

public slots:bool eventFilter(QObject *, QEvent *) override;bool EventFilter::eventFilter(QObject *obj, QEvent *event) {if (obj == ui.label) {		// 判断过滤对象// 鼠标按下事件的处理if (event->type() == QEvent::MouseButtonPress) {	QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);	// 转换为鼠标事件对象if (mouseEvent->button() == Qt::LeftButton) {		// 鼠标左键按下ui.label_2->setText(QString("左键按下图片"));}if (mouseEvent->button() == Qt::MidButton) {			// 鼠标中键按下ui.label_2->setText(QString("中间按下图片"));}if (mouseEvent->button() == Qt::RightButton) {		// 鼠标右键按下ui.label_2->setText(QString("右键按下图便"));}}if (event->type() == QEvent::MouseButtonRelease) {		// 鼠标释放ui.label_2->setText(QString("鼠标释放图片"));}}if (obj == ui.spinBox) {if (event->type() == QEvent::KeyPress) {	// 键盘按下QKeyEvent *key = static_cast<QKeyEvent *>(event);if (key->key() == Qt::Key_Space) {ui.spinBox->setValue(0);}}if (event->type() == QEvent::KeyRelease) {	// 键盘释放ui.spinBox->setValue(100);}}// 事件交给上层对话框进行处理return QDialog::eventFilter(obj, event);
}

总结:

注意:不是所有控件都有鼠标事件或者键盘事件,例如label就没有键盘事件,如果硬是写代码进行判断,是无法操作;spinBox没有鼠标事件等。
好像是只能有其中一种似的,不是很懂这些。
这些是经验所得,测试了很久才总结出来的。除非给部件单独写鼠标事件或者键盘事件。

这篇关于Qt 事件过滤器 - EventFilter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384659

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)

《SpringBoot拦截器Interceptor与过滤器Filter详细教程(示例详解)》本文详细介绍了SpringBoot中的拦截器(Interceptor)和过滤器(Filter),包括它们的... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程1. 概述1

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Java 8 Stream filter流式过滤器详解

《Java8Streamfilter流式过滤器详解》本文介绍了Java8的StreamAPI中的filter方法,展示了如何使用lambda表达式根据条件过滤流式数据,通过实际代码示例,展示了f... 目录引言 一.Java 8 Stream 的过滤器(filter)二.Java 8 的 filter、fi

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台