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 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
712 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
1790 3
|
数据可视化
【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog
774 3
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
4528 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
3220 3
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
2677 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
|
数据安全/隐私保护
【Qt 学习笔记】Qt窗口 | 对话框 | 模态与非模态对话框的创建
【Qt 学习笔记】Qt窗口 | 对话框 | 模态与非模态对话框的创建
1520 4
|
搜索推荐 C++
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
996 4
【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍
【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍
611 3
【Qt 学习笔记】Qt窗口 | 浮动窗口 | QDockWidget的使用及说明
【Qt 学习笔记】Qt窗口 | 浮动窗口 | QDockWidget的使用及说明
2267 3