学习C++、QT---33(QT库中如何使用事件过滤器实现我们的放大缩小字体功能)

🌟 嗨,我是热爱嵌入式的涛涛同学!

每日一言

        别害怕改变,走出舒适圈才能遇见更好的自己。

实现完这个之后我们来接触一下事件过滤器来实现这个功能吧

好的那么我们的这个事件过滤器的这个函数在QObject类里面

这边也有相对应的代码案例进行参考

动手直接上代码

bool Widget::eventFilter(QObject *watchedQEvent *event)

{

    if(event->type()==QEvent::Wheel){

        if(QGuiApplication::keyboardModifiers()==Qt::ControlModifier){

               QWheelEvent * wheelEvent=(QWheelEvent *)event;

               if(wheelEvent->angleDelta().y()>0){

                   zoomIn();

               }else{

                   reduce();

               }

               return true;

        }

        return false;

    }

}

事件过滤器也就是提前处理了,事件会经过  事件产生、事件派发、事件过滤、事件分发、事件处理,

那么我们事件呢就是可以直接在事件过滤器这边实现,那么我们会发现要是我这边写两个事件,一个是滚轮事件、一个是键盘按下事件,那么会发现无法将他们联系在一起啊,也就是事件过滤器在同一时间只能过滤一个事件,所以我们这边需要将滚轮事件和我们的和我们的ctrl进行绑定,那么我们该怎么办呢,那么我们的ctrl也就是按下按键的这个操作不能写成事件,

那么我们该怎么写呢??

那么我们这边提供一个新的用法就是QGuiAppLication::keyboradModifiers()这个函数就是检测按键的状态的,

这边我需要讲解一下

函数作用详解

QGuiApplication::keyboardModifiers() 是一个获取当前键盘修饰键状态的全局函数,核心作用是:
返回当前被按下的修饰键(如 Ctrl、Shift、Alt 等),常用于判断用户是否按下了组合键(如 Ctrl + 滚轮、Shift + 点击等)。

关键细节解析

返回值类型Qt::KeyboardModifiers
这是一个枚举类型,可能的返回值包括:

    1. Qt::NoModifier:无修饰键被按下。
    2. Qt::ControlModifier:Ctrl 键被按下。
    3. Qt::ShiftModifier:Shift 键被按下。
    4. Qt::AltModifier:Alt 键被按下。
    5. 组合值(如 Qt::ControlModifier | Qt::ShiftModifier 表示 Ctrl+Shift 同时按下)。

“当前状态” 的含义
函数返回的是事件队列中最近一次更新的修饰键状态(基于最近的 KeyPress 或 KeyRelease 事件),而非 “实时硬件状态”。

    1. 例如:当你按下 Ctrl 键,Qt 会发送 KeyPress 事件,keyboardModifiers() 会更新为 Qt::ControlModifier
    2. 当你释放 Ctrl 键,Qt 发送 KeyRelease 事件,状态会重置为 Qt::NoModifier

适用场景
用于判断组合键操作,例如:

    1. Ctrl + 滚轮缩放(你的代码中已使用)。
    2. Ctrl+C 复制、Ctrl+V 粘贴等快捷键。
    3. Shift + 点击多选等交互逻辑。

  QWheelEvent * wheelEvent=(QWheelEvent *)event;这句话是因为我们需要转换一下,因为原本的我们的event是QEvent类型的那样的话怎么去获得我们的滚轮的详细信息呢,那么我们就需要进行转换,我们这样的属于是c语言的转换方式,也可以用哈,但是还有几种c++的专门的转换方法

转换完之后我们就可以依据这个滚轮中的angleDelta这个函数进行判断,如果大于0就放大,小于0就缩小

会发现,那我们是不是还需要加上return true 啊

bool Widget::eventFilter(QObject *watchedQEvent *event)

{

    if(event->type()==QEvent::Wheel){

        if(QGuiApplication::keyboardModifiers()==Qt::ControlModifier){

               QWheelEvent * wheelEvent=(QWheelEvent *)event;

               if(wheelEvent->angleDelta().y()>0){

                   zoomIn();

               }else{

                   reduce();

               }

               return true;

        }

        return false;

    }

}

总结

转换的目的是:将通用的事件基类指针,转换为具体的事件子类指针,从而访问该事件特有的属性和方法

会发现我们没有用到这个watched,

总结

你的代码中 watched 未被使用,说明这个过滤器是 **“通用型”** 的(对所有被监听控件生效)。如果未来需要限制缩放功能只对特定控件生效(比如只让文本框缩放,按钮不缩放),就需要通过 watched 来判断对象类型或名称,实现更精确的控制。

这正是 watched 参数的意义:让事件过滤器可以根据事件来源灵活处理不同控件的事件。

Tips:eventFilter() 函数本身是 QObject 类的虚函数(默认实现为空),需要我们在自定义类中重写它,并通过 installEventFilter() 将其安装到目标对象上,才能生效。

1. 事件过滤器的工作流程

默认状态
所有 QObject 子类都有 eventFilter() 函数,但默认实现为空(直接返回 false),不会拦截任何事件。

重写并安装
我们需要在自定义类(如 Widget)中重写 eventFilter(),并通过 target->installEventFilter(this) 将其安装到目标对象(target)上。

事件分发
当 target 接收到事件时,Qt 会先调用其安装的事件过滤器,再将事件传递给 target 自身的事件处理函数。

好的那么我们的记事本项目就完结了,认真学下来会发现学会了很多,从刚开始的懵懵懂懂,到后面会发现我们对Qt手册更会使用了,也就是我们学习QT也就是转换为学习怎么使用QT手册了,因为QT的类有上万个,我们不可能学的完,但是常用的类有几十个,所以我们就是要记住我们现在所学的任何一个类和其中的函数,知道怎么寻找,这个就是我们学QT的得出的经验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的涛涛同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值