Qt--事件过滤器

这篇具有很好参考价值的文章主要介绍了Qt--事件过滤器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

Qt中的事件过滤器(Event Filter)是一种机制,用于拦截并处理特定类型的事件。但和Qt–事件分发器一文中提到的事件分发器有些区别。

事件过滤器的工作原理

这里同样使用一个简单的示例图帮助理解:
Qt--事件过滤器
这里假设有一个Widget父窗口,该窗口中有三个自定义的控件,而且这三个自定义控件中都有重写事件分发器事件。

当父窗口收到来自消息循环的某一事件(信号)时,若父窗口有安装事件过滤器,则会在事件过滤器函数中判断该事件要发往哪个控件(子控件),这就是事件过滤器的作用。

事件过滤器的使用

要使用事件过滤器,需进行以下两步:
①给需要事件过滤的子控件安装事件过滤器
②重写父窗口的事件过滤器函数

例这里在Widget父窗口中给label子控件安装事件过滤器,并在Widget父窗口中重写事件过滤器,以过滤发往label子控件的事件。

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    //重写事件过滤器
    bool eventFilter(QObject* obj, QEvent* e);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

#include "widget.h"
#include "ui_widget.h"
#include <QEvent>
#include <QMouseEvent>

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

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


}

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

//重写事件过滤器
bool Widget::eventFilter(QObject* obj, QEvent* e)
{
    //拦截发往label子控件的鼠标按下事件
    if (obj == ui->label)
    {
        if (e->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent* mouseEv = static_cast<QMouseEvent*>(e);
            QString qs = QString("父窗口的事件过滤器中拦截鼠标按下, x = %1, y = %2").arg(mouseEv->x()).arg(mouseEv->y());
            qDebug() << qs;

            return true;
        }

    }

    return QWidget::eventFilter(obj, e);
}

运行可以看到鼠标按下事件会在Widget的事件过滤器中被拦截:
Qt--事件过滤器

事件过滤器和事件分发器的区别

Qt中的事件分发器(Event Dispatcher)和事件过滤器(Event Filter)都是用于处理事件的机制,但它们的作用和实现方式有所不同。

事件分发器(Event Dispatcher)是Qt中的一个重要组件,它负责将一个对象发出的事件分发给该对象的所有子对象,以及所有被该对象设置为接受该事件类型的父对象。事件分发器可以确保同一时间只有一个子对象或父对象接收到同一个事件,从而避免了事件冲突(event collision)的问题。事件分发器还提供了一些高级功能,如事件分组(event grouping)、事件预取(event prefetching)等,可以进一步提高应用程序的性能和响应速度。

事件过滤器(Event Filter)则是一种简单的事件处理机制,它允许一个对象拦截并处理其他对象发出的特定类型的事件。事件过滤器通过重载 QObject 类中的两个函数:bool eventFilter(QObject *obj, QEvent *event) 来实现对事件的拦截和处理。当一个对象发出一个事件时,如果该事件符合当前对象正在拦截的事件类型,那么该对象就会调用 eventFilter() 函数进行处理;否则,它会继续将该事件分发给其他对象。

总之,事件分发器和事件过滤器都是用于处理事件的机制,但它们的实现方式和作用不同。事件分发器可以确保同一时间只有一个子对象或父对象接收到同一个事件,并且提供了一些高级功能;而事件过滤器则是一种简单的事件处理机制,允许一个对象拦截并处理其他对象发出的特定类型的事件。

总结

通过一个简单的示例熟悉事件过滤器的工作原理,同时也分析了和事件分发器的区别,相信在后续开发中,也可按照实际需要判断是否需要事件分发或过滤。文章来源地址https://www.toymoban.com/news/detail-458433.html

到了这里,关于Qt--事件过滤器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt的事件过滤器installEventFilter

    一、介绍 WPF中使用AddHandler来监听事件,那么QT呢?Qt的事件模型是使用一个QObject对象,来监视发送其他QObject对象的事件,在事件到达之前对其进行处理。这里要使用一个函数 Qt助手的解释如下: 在对象上安装一个事件过滤器filterObj。如下: 其中monitoredObj、filterObj都是QObje

    2024年02月12日
    浏览(36)
  • Qt 事件过滤器使用QPainter绘制温度

    Qt的 eventFilter 是一个事件过滤器,可以用来捕获和处理Qt对象的事件。事件过滤器可以被安装到一个对象上,以便在该对象上拦截和处理包含特定类型和内容的事件。下面是 eventFilter 的简单使用介绍: 创建一个类,并继承自 QObject 。这个类将作为事件过滤器的实现。 在该类

    2024年02月12日
    浏览(26)
  • web3j的基础用法-6合约的监听器事件Event和过滤器EthFilter,以及NullPointed,调用失败导致的bug解决

    本篇以Uniswap为例(https://uniswap.org/) 合约地址 :0x1f9840a85d5af5bf1d1762f925bdaddc4201f984 (Uni) 监听合约Tranfer事件 调用代码 核心代码实现在这里 之前实验全量区块,导致请求多次失败,是由于个人RPC节点的请求和数据有限,为了测试出结果,从13763721L block到当前,结果毫秒级返

    2024年02月11日
    浏览(29)
  • Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点

    现在有一个类似于下方图的ui,用户需要在输入前一行内容后,需要摁下指定案件能够跳转到下一行继续进行输入。 一种更为直接的解决方案是子类化 QLineEdit 并且重新实现鼠标事件 keyPressEvent() ,然后调用 focusNextChild() 。 首先需要创建一个子类MyLineEdit继承于QLineEdit类。然后重

    2024年02月12日
    浏览(38)
  • 【VS Code 与 Qt6】运用事件过滤器批量操作子级组件

    如果某个派生自 QObject 的类重写 eventFilter 方法,那它就成了事件过滤器(Event Filter)。该方法的声明如下: watched 参数是监听事件的对象,即事件的接收者;event 参数当然就是待处理的事件了。事件过滤器(也可以翻译为“筛选器”)可在接收者之前拦截事件,处理完毕后还

    2024年02月08日
    浏览(37)
  • Spring boot 中的过滤器

    `javax.servlet.Filter`接口定义了几个方法: 其中一些经常在过滤器的实现中使用。以下是常用的几个方法: 1. `doFilter()`: 这是过滤器的核心方法,用于实现过滤器的逻辑。在该方法中,您可以对请求进行预处理、修改请求参数、验证身份、记录日志等操作,然后通过调用`Filter

    2024年02月12日
    浏览(32)
  • 【Redis】Redis中的布隆过滤器

    在实际开发中,会遇到很多要判断一个元素是否在某个集合中的业务场景,类似于垃圾邮件的识别,恶意IP地址的访问,缓存穿透等情况。类似于缓存穿透这种情况,有许多的解决方法,如:Redis存储Null值等,而对于垃圾邮件的识别,恶意IP地址的访问,我们也可以直接用 H

    2024年02月12日
    浏览(26)
  • JAVA中的拦截器、过滤器

    相关解释:拦截器依赖于页面有访问controller的操作,且属于SpringMVC体系的动态拦截调用机制,是java中AOP思想的运用。 来看看源码作者的注释: 其中倒数第二段话,描述其类似于过滤器,但其特点只允许使用自定义预处理,不能处理程序本身。此处可体现AOP思想。 过滤器是

    2024年02月13日
    浏览(29)
  • Vue.js 中的过滤器和计算属性

    Vue.js 是一款流行的 JavaScript 框架,它提供了一种简单而灵活的方式来构建交互式 Web 应用程序。在 Vue.js 中,过滤器和计算属性是两个常用的概念。它们可以帮助开发者更方便地处理数据,提高代码的可读性和可维护性。但是这两个概念有什么区别呢?本文将会详细介绍 Vue

    2024年02月08日
    浏览(39)
  • 布隆过滤器及其在Java中的实际应用

    布隆过滤器一直是面试中的重点,本篇文章将深入探讨Java中的布隆过滤器的底层思想,包括它的工作原理、优缺点等。同时,我们将结合一个小实际案例,来给大家展示布隆过滤器在解决实际问题中的应用。 在数据处理领域,我们经常需要判断一个元素是否在一个集合中。

    2024年02月05日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包