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

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

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