学习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的得出的经验。

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

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

相关文章

[每日随题15] 前缀和 - 拓扑排序 - 树状数组

整体概述 难度:1000 →\rightarrow→ 1500 →\rightarrow→ 2000 1567B. MEXor Mixup 标签:前缀和 前置知识:无 难度:Div.2.B 1000 题目描述: 输入格式: 输出格式: 样例输入: …

DDD领域驱动设计C++实现案例:订单管理系统

一、DDD核心概念简介 领域驱动设计(Domain-Driven Design)是一种软件开发方法论,强调将业务领域的概念和规则融入软件设计中。核心概念包括: 值对象(Value Object): 无唯一标识,基于属性值判断相等性实体(Entity): 有唯一标识,其生…

神经网络和机器学习的一些基本概念

记录一些基本概念,不涉及公式推导,因为数学不好,记了也没啥用,但是知道一些基本术语以及其中的关系,对神经网络训练有很大帮助。 可能有些概念不会讲得很详细,但是当你有了这个概念,你就知道往这个方向去获取更详细的信息,不至于连往哪走都不知道。 下面以多元线性回归…

MySQL(146) 如何迁移数据库到新服务器?

数据库迁移到新服务器是一项复杂而重要的任务,确保数据完整性和最小化停机时间至关重要。以下是一个详细的步骤指导,包括准备工作、数据备份、数据传输、数据恢复和验证的全过程。 一、准备工作 1. 确认服务器环境 源服务器:当前运行数据库的…

图论的整合

图 有若干个节点,有若干条边连接节点。(两个点之间不是必须相连) 比如: 有向图 可以理解为边上面有箭头的图,比如下面这张图: 在这张图中,点 111 可以通过这条有向边到达点 222&#xff0c…

电子设计大赛【C语言核心知识点】讲解

目录 前言 1. 基础语法 2. 流程控制 3. 函数 4. 数组与字符串 5. 指针(核心重点) 6. 内存管理 7. 结构体与联合体 8. 文件操作 9. 预处理器 10. 高级特性 内存布局图解 前言 在进行程序代码开发之前,需要掌握好C语言各个模块之间…

Numpy 库 矩阵数学运算,点积,文件读取和保存等

目录 1.数组(矩阵)的组合 2.数组(矩阵)的切割 3.数组的数学运算 4.数组的深拷贝和浅拷贝 5.随机模块 6.矩阵统计运算 7.矩阵的特有运算点积,求逆 8.文件读取和保存 1.数组(矩阵)的组合 水…

STL学习(?函数对象,谓词,内建函数对象)

目录 一、函数对象 1.函数对象的概念 2.函数对象的使用 (1)函数对象在使用的时候,可以像普通函数那样调用,可以有参数,也可以有返回值。 (2)函数对象超出普通函数的概念,函数对象…

【爬虫】05 - 爬虫攻防

爬虫05 - 爬虫攻防 文章目录爬虫05 - 爬虫攻防一:随机User-Agent爬虫1:fake-useragent2:高级反反爬策略3:生产环境建议二:代理IP爬虫1:获取代理IP2:高阶攻防3:企业级的代理实战三&am…

FPGA自学——存储器模型

FPGA自学——存储器模型 文章目录FPGA自学——存储器模型一、IP核二、ROM(read only memory)三、ROM的IP核调用四、RAM(random access memory)五、RAM的IP核调用总结1.不同波形的使用的存储器2.块与分布式的选择3.FPGA与模块的容量…

【C++】stack和queue拓展学习

目录 1.反向迭代器思路及实现 1.1. 源码及框架分析 1.2. 实现反向迭代器 2.stack和queue练习拓展-计算器实现 2.1. 后缀表达式概念 2.2. 后缀表达式运算规则 2.3. 中缀表达式转后缀表达式 2.3.1 转换思路 2.3.2 代码实现 2.4. 计算器实现 1.反向迭代器思路及实现 1.1…

Web3与区块链如何革新网络安全——走在前沿

随着互联网技术的飞速发展,网络安全问题日益成为全球关注的焦点。Web3和区块链技术作为新兴的技术力量,正在逐步改变网络安全的格局。本文将探讨Web3和区块链技术如何革新网络安全,走在技术前沿。 1. Web3技术概述 Web3,即第三代互…

网络初级安全第三次作业

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户登录</title><style>* {margin:…

CSS中用display实现元素的显示/隐藏切换

** 通过display中的none和block ** 在前端开发中&#xff0c;display: none 和 display: block 是两种常用的 CSS 显示模式&#xff0c;核心区别在于&#xff1a;是否在页面中保留元素的占位空间 1. 核心区别属性display: nonedisplay: block占位空间元素完全从渲染树中移除&am…

因果图方法设计测试用例的价值与使用范围

一、因果图方法的核心原理 因果图方法通过分析软件规格说明中的输入条件&#xff08;因&#xff09;和输出结果&#xff08;果&#xff09;之间的逻辑关系&#xff0c;利用图形化方式将这些关系清晰展现。它使用特定的符号表示因果关系&#xff08;如恒等、非、或、与&#xff…

智慧农服数字化平台-数字科技赋能农业,开启智慧三农新篇章

智慧农服数字化平台数字科技赋能农业&#xff0c;开启智慧三农新篇章平台概览在乡村振兴和农业现代化的时代背景下&#xff0c;我们推出了创新的农业服务数字化平台——一个专为农业生产者打造的综合性SaaS服务平台。平台以"科技助农、数据兴农"为使命&#xff0c;通…

在线教育培训课程视频如何防下载、防盗录?

在数字化学习日益普及的今天&#xff0c;高质量的在线课程已成为教育机构、知识付费平台和讲师的核心竞争力。如何在不影响学员正常学习体验的前提下&#xff0c;有效防止课程视频被恶意盗取&#xff1f;今天介绍在线教育课程防下载、防盗录的10种视频加密方法&#xff0c;看看…

图像分析学习笔记(2):图像处理基础

图像分析学习笔记&#xff1a;图像处理基础图像增强方法图像复原方法图像分割方法形态学处理图像增强方法 目的&#xff1a;改善视觉效果&#xff0c;例如增强对比度定义&#xff1a;为了改善视觉效果、便于人或计算机对图像的分析理解&#xff0c;针对图像的特点或存在的问题…

生存分析机器学习问题

研究目标&#xff1a; 开发一个机器学习模型&#xff0c;用于个性化预测XXX的总体生存期。 模型输入&#xff1a;结合生存时间、治疗方案、人口统计学特征和实验室测试结果等多种特征。 模型输出&#xff1a;预测二元结果&#xff08;活着 vs. 死亡&#xff09;。 应用场景&…

【华为机试】547. 省份数量

文章目录547. 省份数量描述示例 1示例 2提示解题思路核心分析问题转化算法选择策略1. 深度优先搜索 (DFS)2. 广度优先搜索 (BFS)3. 并查集 (Union-Find)算法实现详解方法一&#xff1a;深度优先搜索 (DFS)方法二&#xff1a;广度优先搜索 (BFS)方法三&#xff1a;并查集 (Union…