1、事件分离器和事件过滤器之间的关系
事件过滤器eventfilter的优先级别>事件分离器event的优先级别
2、事件过滤器
通过事件过滤器把事件下发到event
使用方法:①、安装事件过滤器 ②、重写eventfilter事件
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); //安装事件过滤器 Widget::ui->label->installEventFilter(this); } //重写eventfilter bool Widget::eventFilter(QObject *watched, QEvent *event) //事件过滤器 { if(watched==ui->label) //可能有多个控件安装了事件过滤器,需要判断 { if(event->type()==QEvent::Enter) { qDebug()<<"eventFillter:进入"; return true; //true表示用户自己处理 } } else //其他事件,交给父类默认处理 { return Widget::event(event); } }
3、事件分发器
不用安装,直接重写
void mylabel::enterEvent(QEvent *event) //进入 { qDebug()<<"进入!"; } void mylabel::leaveEvent(QEvent *event) //离开 { qDebug()<<"离开!"; } bool mylabel::event(QEvent *e) //事件分发器 { //如果是进入事件,做拦截,交由用户处理 if(e->type()==QEvent::Enter) { qDebug()<<"event:进入"; return true; //true表示用户自己处理 } // else if(e->type()==QEvent::Leave) // { // qDebug()<<"event:离开"; // } else //其他事件,交给父类默认处理 { return QLabel::event(e); } }
4、效果图
对进入事件使用事件过滤器,此事件不再调用事件分发器和普通进入事件的函数,当进入事件发生时不再打印 ”进入!”和“ event:进入!”
离开事件没有使用事件过滤器和事件分发器,打印离开事件函数的“离开!”