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