Qt事件处理(三)——事件过滤器

Qt的事件过滤器installEventFilter QT 事件 阅读详情

目录

前言

Qt事件处理(二)——事件处理链中事件的处理过程是先判断发生事件,控件本身是否对事件进行处理,然后传递给父对象。但是事件还有另外一种处理方法,安装事件过滤器。可以认为事件产生的时候先在父控件中对事件进行处理,然后选择是否传递给子对象进行处理。

事件过滤器

事件过滤器函数

  • installEventFilter()和eventFilter()

安装事件过滤器的位置

  • 在QObject中安装事件过滤器
    1
    在这张图片中,MainWindow中有些控件安装了事件过滤器,有些空间没有安装事件过滤器。对应安装了事件过滤器的,我们可以重写eventFilter()来在MainWindow()中处理事件。前提是我们指定控件installEventFilter()安装在MainWindow()中。
    注意:我们可以对一个控件安装多个过滤器,以后有需求继续补充。

  • 在QApplication中安装事件过滤器

3
如果给QApplication安装事件过滤器,相当于在所有的控件对事件进行处理之前,已经在QApplication中对事件进行了处理。
QApplication()中也可以安装多个事件过滤器。安装的事件过滤器,最后安装的先执行。

#include "dialog.h"
#include <QApplication>

class DemoFilter
{
public:
    bool eventFilter(QObject *, QEvent *);

};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    a.installEventFilter(new DemoFilter);

    return a.exec();
}
  • 子类化QApplication并且重新实现notify()

我们也可以在子类化QApplication,也就是继承QApplication,然后重写notify()函数来对事件进行处理。

class MyApplication : public QApplication
{
    bool notify(QObject*, QEvent*)
    {

    }
};

代码

建立三个QLineEdit,默认我们按回车键来对跳转到下一个QLineEdit,但是现在我们修改为按空格键来跳转到下一个QLineEdit。

给对应的QObject安装事件过滤器

  • main.cpp
#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}
  • dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

    bool eventFilter(QObject *, QEvent *);
private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H
  • dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QKeyEvent>

// Dialog is Filter
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    ui->nameLineEdit->installEventFilter(this);
    ui->idLineEdit->installEventFilter(this);
    ui->phoneNumberLineEdit->installEventFilter(this);
}

Dialog::~Dialog()
{
    delete ui;
}

// target is the object which trigger event
bool Dialog::eventFilter(QObject *target, QEvent *event)
{
    if(target == ui->nameLineEdit ||
            target == ui->idLineEdit ||
            target == ui->phoneNumberLineEdit)
    {
        // QEvent
        if(event->type() == QEvent::KeyPress)
        {
            // QKeyEvent
            QKeyEvent *keyEvent = (QKeyEvent*)event;
            if(keyEvent->key() == Qt::Key_Space)
            {
                focusNextChild();
                return true;
            }
        }
    }
    // QDialog's filter and Dialog's filter
    // if the target has other event, use default event.
    return QDialog::eventFilter(target, event);
}
  • dialog.ui
    2
    这三个窗口的objectName分别是nameLineEdit,phoneNumberLineEdit,idLineEdit。

总结

事件处理的方法如下:
1. 重新实现事件处理器
2. 重新实现QObject::event()
3. 在QObject中安装事件过滤器
4. 在QApplication对象中安装事件过滤器(全局事件处理)
5. 子类化QApplication并且重新实现notify()(全局事件处理)
感觉来说,方法1~方法3都比较适合做事件处理。

Qt 事件处理机制 (二):事件过滤器 事件过滤的方法: installEventFilter(),指定的过滤器对象在其 QObject::eventFilter() 函数中接收目标对象的事件。 事件过滤器可以在目标对象之前处理事件,从而使它可以根据需要检查和丢弃事件。 可以使用 QObject::removeEventFilter() 函数删除现有的事件过滤器。 notify() 我们还使用上一章的例子( MyWidget ),来观察事件的传递,窗口如下。 为 w0安装事件过滤器 w2,然后重写 eventFilter() 函数,.. 阅读详情

相关推荐

Qt窗口尺寸固定:禁止拖拽的3种实现方案与跨平台避坑指南

在桌面应用开发中,窗口尺寸管理是影响用户体验和界面稳定性的基础技术。其核心原理在于通过设置窗口的最小/最大尺寸约束或修改窗口标志,从系统层面限制尺寸变更请求。这一技术的工程价值在于确保精密布局的UI(如仪表盘、数据看板、工业控制界面)不被破坏,保障核心功能的可用性。典型的应用场景包括需要固定比例展示的媒体播放器、工具型软件、以及对话框等。本文聚焦Qt框架,深入解析通过**窗口标志硬性锁定**、**事件过滤器拦截**以及**无边框窗口定制**三种主流方案,并结合**跨平台兼容性**与**高DPI缩放**等高频

weixin_26767391的博客 340

给QApplication安装事件过滤器 eventFilter()

考虑对QApplication安装事件过滤器,然后登录按钮控件去判断是否需要退出登录。在一个界面中,要实现一个对鼠标或键盘事件的检测,长时间未操作,则退出登录。首先继承QObject写一个事件过滤类。在main函数注册事件过滤器。

皮牙子快跑的博客 970

QT事件与事件处理

被拖动的组件称为拖动点,接受拖放操作的组件称为放置点。重新实现event函数首先要判断事件类型,选择要处理的事件进行处理,如果不处理使用ignore()函数忽略该事件,该事件被忽略后会由父容器组件的event函数再次处理。事件过滤器是QObject提供的一种处理事件的方法,将一个对象的事件委托给另一个对象来监视并处理,监视的对象就是事件过滤器。QWidget重新实现了event函数,针对典型类型的事件定义了专门处理的函数,命名为(典型事件+event)。自生事件,分布事件是异步的,发送事件是同步的。

E_Diligent的博客 1793

qt事件过滤器

而不是整体qapp注册 qapp注册要很小心 所以做到最小对象的事件过滤器 之后看看目标对象和事件过滤器对象再区别一下。3.会来很多次事件过滤 相当于全部派发 有处理对应事件的函数就处理 没有就派发完都没有的话就结束。2.返回调上一层也就是父类的虚函数的时间过滤器函数。没写完 之后回去记得写 例子照下来。1.qapp 单个注册 事件过滤器。4 正则表达式 限制输入的是什么。

weixin_72581824的博客 114

Qt事件处理汇总

QT事件产生后会被立即发送到相应的QWidget对象相应的QWidget中的event(QEvent *)进行事件处理event(QEvent *)根据事件类型调用不同的事件处理函数在事件处理函数中发送QT预定义的信号调用信号关联的槽函数public:protected:elseMain.cpp编译运行程序,鼠标点击按钮后打印出“Left press”字符串,没有打印出“child clicked”字符串。

qq_31286321的博客 1770

Mumax3代码模板:从基础设置到材料参数优化

本文提供了一份详尽的Mumax3微磁学模拟代码模板,从基础网格设置、边界条件到核心材料参数(如钴的Msat、Aex、Ku1)配置与优化均有涵盖。文章深入解析了特征长度计算、初始化方法、弛豫与动力学模拟流程,并分享了并行计算与参数扫描等效率提升技巧,旨在帮助用户快速上手并优化模拟工作流。

moss5的博客 703

Qt安装事件过滤器

Qt事件过滤器

威桑的博客 1213

手把手教你用VS Code + Codex在WSL中高效编程(避坑指南)

本文提供了一份详细的避坑指南,教你如何在WSL环境中高效配置和使用VS Code与OpenAI Codex。文章核心在于解决WSL内Codex扩展的OAuth登录失败问题,推荐将扩展安装在Windows本地,并通过UNC路径直接访问WSL文件系统,从而实现AI辅助编程与Linux开发环境的无缝结合,提升编码效率。

weixin_28677451的博客 1067

Qt中事件处理的方法

一、Qt中事件处理的方式 1、事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理。然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是每个事件都对应同一个事件处理器,在该事件处理器中对不同的事件进行分类处理,这样的弊端有两点:第一,导致该事件处理器过于臃肿复杂;第二,这样不便于扩展,当系统新增加事件类型或者是我们需要使用到自定义事件时,就不得不修改Qt的源码来达到目的。所以Qt设计者的做法是针对不同类型的事件提供不同的...

陌上人如玉,公子世无双。 302

nnU-Net v2实战:从零开始配置环境与训练自定义医学影像数据集

本文详细介绍了nnU-Net v2在医学影像分割中的实战应用,从环境配置到自定义数据集训练的全流程。重点讲解了Python 3.9+环境搭建、PyTorch安装技巧、医学影像数据预处理规范,以及五折交叉验证训练方法,帮助开发者快速掌握这一先进的医学影像分析工具。

weixin_28718487的博客 352

WPF窗口定位技巧:从基础到高级的三种实现方法

本文详细解析WPF窗口定位的三种核心方法:屏幕居中(CenterScreen)、父窗口居中(CenterOwner)和手动定位(Manual)。通过对比其适用场景、实现代码与注意事项,帮助开发者根据实际需求选择最佳方案,从而提升WPF应用程序的用户体验与专业度。

weixin_29224309的博客 273

QT事件系统

定义事件类型:通过获取自定义事件类型 ID(确保唯一);创建事件子类:继承QEvent,封装事件数据;发送事件:使用或发送;处理事件:在目标对象的event()函数中判断自定义类型并处理。示例:自定义 “数据更新” 事件// 1. 定义事件类型(确保全局唯一)// 2. 自定义事件类(封装数据)public:} // 获取事件数据private:// 事件携带的数据// 3. 处理自定义事件的对象Q_OBJECTprotected:// 转换为自定义事件并处理。

m0_68381723的博客 1038

Open3D点云数据处理(二):读写点云,你真的会吗?

本文详细介绍了open3d加载点云、保存点云的方法,同时打印点云坐标、颜色、法向量等字段信息。

孙悟空 2604

Qt基础学习

MOC为含Q_OBJECT的类生成元对象代码 →元对象系统提供运行时反射能力 →信号与槽借助元对象实现动态连接 →对象树基于QObject父子关系,统一管理生命周期。父子对象树:核心机制,自动管理相关对象生命周期C++ RAII原则:结合智能指针提供额外安全事件循环支持跨线程安全删除除了内置事件,Qt 允许您创建自己的事件类型。这在需要跨线程通信、或在不同对象间发送复杂通知时非常有用。使用类型的唯一值,通常通过动态获取,或者使用一个大于(1000) 的静态值。从QEvent。

zero1Hu的博客 352

执行HDevelop项目

这一节,我们讲述的是如何用HDevEngine加载和执行一个HDevelop项目。代码部分来源于示例程序exec_program(源文件exec_program.cpp),检测塑料零件边界上的毛刺。1.Step 1:初始化首先,我们包含HALCON/C++和HDevEngine头文件以及命名空间。注意到在这个示例程序中,HDevEngine头文件已经包含在my_hdevoperatorimpl中,所

Z's Palace 2997

【ROS2】手眼标定:moveit2_handeye_calib使用详解

moveit2_handeye_calib MoveIt2 官方的 手眼标定功能包,包含标定插件、图形化界面和示例程序。提供基于 ArUco/ChArUco 标定板的采集与求解功能。标定板下载aruco在线生成器。

郭老二 248

Qt之事件处理机制

Qt 是一个基于 C++ 的框架,主要用来开发带窗口的应用程序。使用的基于窗口的应用程序都是基于事件,其目的主要是用来实现回调(因为只有这样程序的效率才是最高的)。所以在 Qt 框架内部提供了一些列的事件处理机制,当窗口事件产生之后,事件会经过:事件派发 -> 事件过滤->事件分发->事件处理四个阶段。Qt 窗口中对于产生的一系列事件都有默认的处理动作,如果有特殊需求就需要在合适的阶段重写事件的处理动作。事件(event)是由系统或者 Qt 本身在不同的场景下发出的。当用户按下 / 移动鼠标、敲下键盘,或者

风间琉璃的博客 5031

QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图、天地图)

QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图)

1万+

【Qt 事件】—— 详解Qt事件处理

详解Qt事件处理

m0_56069910的博客 3751

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Qt--事件过滤器

通过一个简单的示例熟悉事件过滤器的工作原理,同时也分析了和事件分发器的区别,相信在后续开发中,也可按照实际需要判断是否需要事件分发或过滤。

SNAKEpc12138的博客 5431

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Qt事件处理流程

Qt事件处理 Qt的事件处理大概大概可以分为四个步骤: 事件派发 ->事件过滤 ->事件分发 ->事件处理 事件派发:事件派发 是由Qt框架(QApplication 对象)来完成的,它将当前应用程序产生的事件派发给对应的窗口 事件过滤:事件在到达对应的窗口之前,可以被其他对象过滤、拦截、处理 事件分发:每个窗口都会有一个事件分发器,事件分发器会对时间进行分类,再将分好类的事件分发给对应的事件处理函数进行处理,每个事件处理函数的功能其实是非常单一的,只处理当前这一类事

weixin_41502364的博客 2587

QT的事件分发、事件过滤器详解

一、事件的流向 QT的各种控件(QObject的子类)都有事件处理成员函数,例如: bool QObject::event(QEvent *e);//所有事件 dragEnterEvent(QDragEnterEvent *);//拖拽进入事件 focusInEvent(QFocusEvent *);//获得焦点事件 mousePressEvent(QMouseEvent *);//鼠标压下事件 ····//还有几十个各种类型的事件,不一一列举了,任何一个控件的帮助文件里都可以查到 这些事件需要继承父类

u011555996的博客 5544

【QT】事件分发器/事件过滤器/事件处理的介绍和使用

事件分发器:返回值 bool 如果返回时true,代表用户要处理事件,不再分发事件了。 - 事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。 - event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理(eventhandler)。 因此如上所述,**event()函数主要用于事件的分发**。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。

weixin_52958292的博客 2537

【Qt开发】Qt系统(三)->事件过滤器

本文介绍了Qt中的事件过滤器(Event Filter)机制,它是一种高效灵活的事件拦截处理方式。文章首先概述了事件过滤器的作用和优势,能够在不继承控件类的情况下集中管理多个对象的事件。然后详细讲解了事件过滤器的工作原理,包括其优先级特点和事件传递流程。接着通过具体代码示例,展示了如何使用事件过滤器的两个关键步骤:安装事件过滤器和重写eventFilter()函数。最后总结了事件过滤器在代码结构、维护性、动态管理等方面的优势,以及它在全局快捷键、输入验证等场景中的典型应用。全文系统性地阐述了Qt事件过滤器的

枫叶丹4的博客 1824

QT中事件及事件处理

QT中事件及事件处理 什么是事件,事件与Qt中信号的区别? 个人所见: 事件是应用程序对内部或者外部的动作的统称。 信号是事件的后续响应通知 例如你点击了一个按钮,物理上的鼠标点击动作就是事件,而程序收到事件时,就会发出按钮被按下的信号,通知按钮被按下了。 常见的事件有:鼠标事件,定时事件,键盘事件,关闭事件,上下文菜单事件,拖放事件。 QT事件封装 在Qt中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等,它们

如梦人身 3649

QT的事件处理

Qt平台中的事件处理机制是GUI应用程序的核心,涉及事件的生成、入队、分发和处理。事件可以是用户界面事件、系统事件或自定义事件,通过事件队列和事件轮询机制进行管理。开发者可以通过重写事件处理函数或使用事件过滤器来定制事件处理逻辑。

2401_85166025的博客 1134
上一篇: Qt事件处理(二)——事件处理链
下一篇: Qt事件处理(四)——重写event()函数
simonXi-tech
博客等级 码龄10年 398粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值