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,对它进行拦截或者过滤


相关文章
|
1月前
|
存储 开发框架 开发者
QT C++焦点事件:多角度解析实用技巧与方法
QT C++焦点事件:多角度解析实用技巧与方法
158 0
|
2月前
|
API
QT基础入门——Qt事件(五)
QT基础入门——Qt事件(五)
54 0
QT基础入门——Qt事件(五)
|
5月前
|
存储 Cloud Native 程序员
C++ Qt 事件(event)
C++ Qt 事件(event)
|
1月前
|
测试技术 数据库 C++
Qt C++拖放事件探索之旅:多方法深入解析
Qt C++拖放事件探索之旅:多方法深入解析
120 1
|
3月前
Qt6学习笔记十一(计时器事件)
Qt6学习笔记十一(计时器事件)
27 0
Qt6学习笔记十一(计时器事件)
|
3月前
|
C++
Qt6学习笔记十(鼠标事件、事件分发器)
Qt6学习笔记十(鼠标事件、事件分发器)
34 0
|
4月前
[Qt5] 鼠标响应事件和计时器事件
[Qt5] 鼠标响应事件和计时器事件
26 0
|
5月前
《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件
《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件
80 0
|
5月前
《QT从基础到进阶·十四》QPoint,QPen,QPainter,QFont,焦点事件使用
《QT从基础到进阶·十四》QPoint,QPen,QPainter,QFont,焦点事件使用
59 0
|
1月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
38 8
C++ Qt开发:QTcpSocket网络通信组件

热门文章

最新文章

推荐镜像

更多