Qt 事件过滤器

2023-11-07

通过前面的学习,我们已经知道,Qt 创建了QEvent事件对象之后,会调用QObject的event()函数处理事件的分发。显然,我们可以在event()函数中实现拦截的操作。由于event()函数是 protected 的,因此,需要继承已有类。如果组件很多,就需要重写很多个event()函数。这当然相当麻烦,更不用说重写event()函数还得小心一堆问题。好在 Qt 提供了另外一种机制来达到这一目的:事件过滤器。
在这里插入图片描述
QObject有一个eventFilter()函数,用于建立事件过滤器。函数原型如下:

virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );

这个函数正如其名字显示的那样,是一个“事件过滤器”。所谓事件过滤器,可以理解成一种过滤代码。事件过滤器会检查接收到的事件。如果这个事件是我们感兴趣的类型,就进行我们自己的处理;如果不是,就继续转发。这个函数返回一个 bool 类型,如果你想将参数 event 过滤出来,比如,不想让它继续转发,就返回 true,否则返回 false。事件过滤器的调用时间是目标对象(也就是参数里面的watched对象)接收到事件对象之前。也就是说,如果你在事件过滤器中停止了某个事件,那么,watched对象以及以后所有的事件过滤器根本不会知道这么一个事件。
代码实现如下:
1.安装事件过滤器

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);

    //安装事件过滤器
    ui->label_filter->installEventFilter(this);
    ui->label_filter->setMouseTracking(true);


}

2.在MyWidget类中重写eventFilter函数

bool MyWidget::eventFilter(QObject*obj,QEvent*e)
{
    if(obj==ui->label_filter)
    {
        QMouseEvent*env=static_cast<QMouseEvent*>(e);

        if(e->type()==QEvent::MouseMove)
        {
            ui->label_filter->setText(QString("Mouse Move:(%1,%2)").arg(env->x()).arg(env->y()));
            return true;
        }
        if(e->type() == QEvent::MouseButtonPress)
        {
            ui->label_filter->setText(QString("Mouse Press:(%1,%2)").arg(env->x()).arg(env->y()));
            return true;
        }
        if(e->type() == QEvent::MouseButtonRelease)
        {
            ui->label_filter->setText(QString("Mouse Release:(%1,%2)").arg(env->x()).arg(env->y()));
            return true;
        }


    }


    return QWidget::eventFilter(obj,e);

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 事件过滤器 的相关文章

  • 单例模式实现

    单例模式 一个类在任何情况下都绝对只有一个实例 并提供一个全局访问点 单例模式是创建型模式 单例模式的应用场景 某类只要求生成一个对象的时候 如一个国家主席 班级班长等 单例模式的好处 由于单例模式只允许创建一个对象 共享该对象可以节省内存
  • Qt5.7.0配置选项(configure非常详细的参数)

    configure是一个命令行工具 用于配置Qt编译到指定平台 configure必须运行于Qt源码根目录 当运行configure时 编译源码使用的是所选工具链中的make工具 一 源码目录 编译目录和安装目录 源码目录就是包含源码的目录
  • Qt连接SQL server数据库

    Qt连接SQL server数据库 由于课程设计需要 需要用qt设计一个界面来操作数据库 在建立数据库连接时 期间遇到各种问题 Qt 连接SQL server数据大致可以概括为下图的三层模型 箭头代表他们之间的依赖关系 第一步 建立目标数据
  • Qt中定义全局变量方法

    在使用qt编程时经常要使用到全局变量 全局变量该如何去定义和初始化呢 有两种方式 第一种使用extern 关键字 global h extern int a global cpp static int a 1 myfile cpp incl
  • Qt样式表

    一 QT样式表简介 1 QT样式表简介 QSS的主要功能是使界面的表现与界面的元素分离 使得设计皮肤与界面控件分离的软件成为可能 QT样式表是允许用户定制widgets组件外观的强大机制 此外 子类化QStyle也可以定制widgets组件
  • Qt实战之实现图片浏览系统

    引言 本系统支持 自动播放 左右拖动切换 点击列表切换 点击按钮切换 是一个标准的图像浏览软件 Windows 图片浏览器 可以查看当前文件夹下的图片 往上翻 往下翻并且自动播放 此系统增加一个列表 本文福利 莬费领取Qt开发学习资料包 技
  • 教你使用windeployqt工具来进行Qt的打包发布

    Qt 官方开发环境使用的动态链接库方式 在发布生成的exe程序时 需要复制一大堆 dll 如果自己去复制dll 很可能丢三落四 导致exe在别的电脑里无法正常运行 因此 Qt 官方开发环境里自带了一个工具 windeployqt exe 问
  • Qt 判断信号是否绑定了

    本文介绍Qt的信号是否被连接了和信号槽之间的参数是否一致的判断方法 1 判断信号是否正确连接 通过判断connect的返回值是否为true 1 bool ok connect this SIGNAL signal1 this SLOT sl
  • 如何用qt获取/etc/network/interface文件中的配置信息及写入信息

    void read interface file QFile readFile etc network interfaces QString strAll if readFile open QIODevice ReadOnly QIODev
  • qt creator编译qt工程时报错:undefined reference to

    qt creator编译qt工程时报错 undefined reference to qt creator编译qt工程时报错 该错误指向了本地文件 且经过调研知道 该类错误一般都是链接问题 仔细查看一下pro和pri文件 发现SystemL
  • Qt窗口之QMainWindow、QDialog、QWidget

    在 Qt 中 我们将窗口和控件统称为部件 Widget 窗口是指程序的整体界面 可以包含标题栏 菜单栏 工具栏 关闭按钮 最小化按钮 最大化按钮等 控件是指按钮 复选框 文本框 表格 进度条等这些组成程序的基本元素 一个程序可以有多个窗口
  • Qt 编译错误 提示TypeError: Property 'asciify' of object Core::Internal::UtilsJsExtension(0x27a9278) is not

    编译Qt 时提示错误 TypeError Property asciify of object Core Internal UtilsJsExtension 0x27a9278 is not a functio 说明 出现这个错误的表层原因
  • Qt 事件过滤器

    通过前面的学习 我们已经知道 Qt 创建了QEvent事件对象之后 会调用QObject的event 函数处理事件的分发 显然 我们可以在event 函数中实现拦截的操作 由于event 函数是 protected 的 因此 需要继承已有类
  • qt creator编译报错:parse error

    qt creator编译报错 parse error 利用qt creator编译qt工程时 出现报错信息parse error 出现错误的文件是pri文件 出现这种错误 一般是pro或pri出现了语法错误 经过检查 发现我的报错原因是pr
  • 【Qt编程笔记】采用遍历方式删除QList中全部元素的方法

    QList类是Qt提供的链表模板类 在日常工作和学习中经常会用到 虽然QList操作十分便利 但是在用遍历方式删除全部元素时很可能会因为疏忽造成没有将元素全部删除 从而给程序留下隐患 下面小结一下采用遍历方式删除QList中全部元素的方法
  • Qt中的主窗口QMainWindow

    GUI应用程序都有一个主窗口 虽然前面讲到的QWidget组件也可以定义生成主窗口 但是Qt还定义了一个专门用于实现主窗口的类QMainWindow 为什么 跟QDialog一样的道理 主窗口具有许多主窗口特有的元素组件 为了程序的复用性
  • QT4、5、6各版本之间的特点和选择

    文章目录 0 引入 1 稳定版本 2 各版本冷知识 持续补充 3 5 0系列主要版本特性 4 建议 0 引入 QT用的最多的是QT5系列 qt6系列目前虽然是一个大版本 增加了更多的系列 但是不稳定且要求win10以及以上版本 1 稳定版本
  • Qt安装(Windows平台)

    Qt 的安装组件分为两部分 一部分是 Qt 5 9 分类下的 该分类包含的是真正的 Qt 开发库组件 另一部分是 Tools 分类下的 该分类包含的是集成开发环境和编译工具 Qt 5 9 分类下的开发组件 组件 说明 MinGW 5 3 0
  • QPoint与QPointF的区别

    QPointF类使用浮点精度定义平面中的点 QPoint类使用整数精度定义平面中的点
  • Qt之QSS中替代background-position的方法。

    学过css的朋友 应该都多少了解一些雪碧图相关的知识 雪碧图 用的就是background position来确定选取的素材位置 比如 素材中每张扑克的宽高分别为49px 66px 如果我要选用红桃8 我就会在css中写 backgroun

随机推荐

  • go网站收藏

    golang修养之路 go每日新闻 go语言社区 go语言设计与实现
  • 报错解决:Process finished with exit code -1073741819 (0xC0000005)

    简单记录一下程序异常终止 抛出 Process finished with exit code 1073741819 0xC0000005 的解决方法 一 程序中文件位置错误 缺少文件 位置错误1 如果使用相对路径的话 推荐换成绝对路径进行
  • 剑指 Offer 11. 旋转数组的最小数字(java+python)

    把一个数组最开始的若干个元素搬到数组的末尾 我们称之为数组的旋转 给你一个可能存在 重复 元素值的数组 numbers 它原来是一个升序排列的数组 并按上述情形进行了一次旋转 请返回旋转数组的最小元素 例如 数组 3 4 5 1 2 为 1
  • Java日志的占位符

    如果日志中是集合 且集合的对象为基本数据类型 那么占位符和基本数据类型保持一致 如果集合对象为自定义对象 那么需要获取对应的实例后再获取对应的属性 看属性的基本数据类型 如果不需要获取属性 就把对象toString后用 s接收 payloa
  • Parse方法解析字符串

    今天才注意到Parse方法解析字符串时可以通过NumberStyles枚举和IFormatProvider接口分析字符串的格式
  • Qt的事件过滤器installEventFilter

    一 介绍 WPF中使用AddHandler来监听事件 那么QT呢 Qt的事件模型是使用一个QObject对象 来监视发送其他QObject对象的事件 在事件到达之前对其进行处理 这里要使用一个函数 void QObject installE
  • Typora主题推荐

    Typora主题推荐 官网 https theme typora io 以前我用的是github主题 现在是Drake 但是字体有点小 改了css 进行微调一下 1 cobalt主题 2 Drake主题 3 fluent主题 4 gitbo
  • 读《自己动手写操作系统》(于渊著)第一节

    最近开始看 自己动手写操作系统 虽然很早以前就读过一点点 但一直没有机会动手实践 本着光说不练假把式的原则 今天动手实践了开头的一部分 说得这么正经其实你就是看了一点点吧 囧 废话不多说 在这里做一个小小的总结 实验环境 操作系统 win7
  • python实现调用科大讯飞语音听写(将音频识别成文字输出)

    一 大致流程 1 申请科大讯飞账号 https passport xfyun cn register 2 创建应用 应用平台选择WebAPI 3 查看开发文档 4 根据开发文档和示例代码进行调试 二 申请科大讯飞账号 首先我们先去科大讯飞开
  • MySQL——通过binlog恢复数据

    目录 1 binlog基本概念 2 MySQL开启binlog 3 使用binlog日志恢复数据 3 1 恢复前准备工作 3 2 数据恢复 3 2 1 通过mysqlbinlog将binlog转为sql 以方便查询具体位置 3 2 2 查看
  • 零点分布对单位脉冲响应的影响

    共四个二阶网络的系统函数 画系统零极点分布图 求各系统单位脉冲响应 画波形 H1 clc clear all close all A 1 1 6 0 9425 B 1 0 0 figure zplane B A z roots B zero
  • DM8 用户与权限管理

    一 用户及权限管理 1 1 创建用户 create user test identified by Test 1234 default tablespace test 1 2 用户改密码 alter user SYSDBA identifi
  • 【战略布局】12.8黄金白银涨跌发展趋势-黄金原油走势操作建议

    黄金消息面与技术面解析 消息面 周三 12月8日 亚市盘中 黄金期货温和上涨 现报1789美元 盎司附近 稍早期金曾短暂突破1790美元 盎司关口 周二 12月7日 金价小幅上涨 主要是受到通胀预期和地缘局势担忧的支撑 投资者将注意力聚焦将
  • Xshell突然连接不上虚拟机的解决

    目录 问题描述 失败的尝试 最终解决 感想 问题描述 国庆节后继续学习 在使用Xshell登录虚拟机时突然登不上了 而且只有三台中的一台登不上 考虑到之前对虚拟机的配置是在一台win机器上使用VMware Workstation软件创建了三
  • 锐浪(Grid++Report)报表脚本通过某些字段隐藏控件

    var panduantj Report ParameterByName leix AsString 你的字段名 var xians Report ControlByName chuchai 获取图片控件 if panduantj 出差 x
  • wps合并重复项并求和_表格技巧—Excel中重复项求和的方法

    在Excel统计数据时 经常会碰到重复项反复出现 很干扰视线 想要对重复项进行合并并求和 那要如何操作呢 下面 小编跟大家详细讲解Excel合并重复项数据并求和的操作方法 首先打开一个需要处理的Excel表格 比如对下列表格中相同型号的数量
  • Scrapy中extract_first()和extract()的区别

    测试用到的爬取网站 In 11 print response xpath h3 a title scrapy selector unified SelectorList 是Selector组成的列表 Out 11 为了方便阅读换行符我手打的
  • python降低cpu的占用

    import signal import resource import os import time from multiprocessing import Process def time exceeded signo frame ti
  • 2023华为OD机试真题-工作安排(JAVA、Python、C++)

    题目描述 小明每周上班都会拿到自己的工作清单 工作清单内包含n项工作 每项工作都有对应的耗时时长 单位h 和报酬 工作的总报酬为所有已完成工作的报酬之和 那么请你帮小明安排一下工作 保证小明在指定的工作时间内工作收入最大化 输入描述 输入的
  • Qt 事件过滤器

    通过前面的学习 我们已经知道 Qt 创建了QEvent事件对象之后 会调用QObject的event 函数处理事件的分发 显然 我们可以在event 函数中实现拦截的操作 由于event 函数是 protected 的 因此 需要继承已有类