Qt6学习笔记十二(事件分发器、事件过滤器)

简介: Qt6学习笔记十二(事件分发器、事件过滤器)

接着Qt6学习笔记十(鼠标事件、事件分发器)的案例

一、事件分发器

可以在文档中搜索QEvent中找到Type的枚举值,里面有一系列事件

event中如果返回true就可以进行事件拦截(不会进行向下分发了),下面例子中可以看到,如果事件type是鼠标按下,那么就返回true,不会执行,鼠标按下事件void myLabel::mousePressEvent了。

mylabel.h中

//通过event事件分发器 拦截 鼠标按下事件
    bool event(QEvent *e);

mylabel.cpp中

bool myLabel::event(QEvent *e){
    //如果是鼠标按下,在event事件分发中做拦截
    if(e->type()==QEvent::MouseButtonPress){
        QMouseEvent* ev= static_cast<QMouseEvent*>(e);
        QString str = QString("Event the mouse pressed x=%1  y=%2  globalX=%3  globalY=%4")
                .arg(ev->pos().x()).arg(ev->pos().y()).arg(ev-> globalPosition().x()).arg(ev->globalPosition().y());//(可以文档搜索arg用法,链式编程)
        qDebug()<<str;
        return true;//true代表用户自己处理这个事件,不向下分发(也就是说不会执行void myLabel::mousePressEvent)
    }
    //其他事件 交给父类处理(默认处理)
    return QLabel::event(e);
}

事件分发器:总结

二、事件过滤器

通过事件过滤器,可以在程序分发到event事件之前再做一次高级拦截

使用 两个步骤

1.给控件安装事件过滤器

2.重写eventfilter事件

在widget.cpp构造函数中

//给label1 安装事件过滤器
    //步骤1:安装事件过滤器
    ui->label->installEventFilter(this);

widget.cpp中

//步骤2:重写eventfilter
bool Widget::eventFilter(QObject *watched, QEvent *event){
    if(watched==ui->label){
        if(event->type()==QEvent::MouseButtonPress){
            QMouseEvent* ev= static_cast<QMouseEvent*>(event);
            QString str = QString("EventFilter the mouse pressed x=%1  y=%2  globalX=%3  globalY=%4")
                    .arg(ev->pos().x()).arg(ev->pos().y()).arg(ev-> globalPosition().x()).arg(ev->globalPosition().y());//(可以文档搜索arg用法,链式编程)
            qDebug()<<str;
            return true;//true代表用户自己处理这个事件,不向下分发(也就是说不会执行void myLabel::mousePressEvent)
        }
    }
    //其他默认处理(交给父类处理)
    return QWidget::eventFilter(watched,event);
}

这样就可以在事件分发器前再做一次更高级的拦截。

事件过滤器:总结

总结

事件过滤器可以理解为,可以对当前控件下的子控件进行操作

事件分发器可以理解为,对当前控件进行操作。

于是子控件就拥有,过滤和分发,两次拦截作用

用处:

在某种条件下,比如点击几次鼠标后,我们就不必要使用这种操作了,可以设置一个flag,对它进行拦截或者过滤


相关文章
|
开发者
Qt异步实现事件的定时执行 - QTimer和QThread的联合使用
通过将QTimer和QThread结合使用,Qt开发者可以实现高效的异步定时任务执行。这种方法不仅可以提升应用程序的响应能力,还可以在复杂的多线程环境中保持代码的简洁和可维护性。希望本文的详细介绍和示例代码能够帮助您更好地理解和应用这一技术。
966 14
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
670 3
(13) Qt事件系统(two)
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
546 0
(12)Qt事件系统(one)
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
624 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
1558 3
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
573 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
735 0
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
1023 2