赞
踩
很高兴在雪易的CSDN遇见你 ,给你糖糖
欢迎大家加入雪易社区-CSDN社区云
本文分享QT中的事件Event技术,主要从QT事件流程和常用QT事件方法等方面展开,希望对各位小伙伴有所帮助!
感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!
你的点赞就是我的动力(^U^)ノ~YO
目录
问题1:子级执行了mousePressEvent,而父级未执行
QEvent是QT中所有事件的基类,包括鼠标事件、键盘事件、QPaintEvent重绘事件、Timer事件、Drop事件。
事件的执行过程:由QApplication对象的exec事件循环监听整个界面中所有控件的发生的事件Event。当某个控件产生相关事件后,QApplication对象会执行notify函数,向此控件发送通知。控件收到事件通知后,会进行事件过滤(eventFilter)和事件分发(event)最后到达事件处理函数。
以Widget为例进行说明
重写notify函数
- bool zxApplication::notify(QObject *obj, QEvent *e)
- {
- if(e->type() == QEvent::MouseButtonPress)
- {
- qDebug()<<"notify: "<<obj->objectName()<<" "<<e->type()<<endl;
- //return true;
- }
- return QApplication::notify(obj, e);
- }
- void eventTestWidget::mousePressEvent(QMouseEvent *ev)
- {
- qDebug()<<"eventTestWidget::mousePressEvent "<<endl;
- }
-
- bool eventTestWidget::event(QEvent *event)
- {
- qDebug()<<"eventTestWidget::event "<< event->type()<<endl;
- return QWidget::event(event);
- }
-
- bool eventTestWidget::eventFilter(QObject *obj, QEvent *ev)
- {
- if(obj == ui->widget && ev->type()==QEvent::MouseButtonPress)
- {
- qDebug()<<"eventTestWidget::eventFilter widget "<< ev->type()<<endl;
- return false;
- }
-
- return QWidget::eventFilter(obj, ev);
- }
重写eventFilter函数
- void zxWidget::mousePressEvent(QMouseEvent *ev)
- {
- qDebug()<<"zxWidget::mousePressEvent "<<endl;
- QWidget::mousePressEvent(ev);
- }
-
- bool zxWidget::event(QEvent *event)
- {
- qDebug()<<"zxWidget::event "<< event->type()<<endl;
- return QWidget::event(event);
- }
-
- bool zxWidget::eventFilter(QObject *obj, QEvent *ev)
- {
- if(ev->type()==QEvent::MouseButtonPress)
- {
- qDebug()<<"zxWidget::eventFilter "<< ev->type()<<endl;
- return false;
- }
-
- return QWidget::eventFilter(obj, ev);
- }
当在widget中点击鼠标左键时,触发
- //第一步:Application的notify,接收到 mouseBottonPress事件,顺序:父级-》子级
- notify: "eventTestWidgetWindow" QEvent::MouseButtonPress
-
- notify: "widget" QEvent::MouseButtonPress
-
- //第二步:父级窗口eventFilter执行事件过滤
- eventTestWidget::eventFilter widget QEvent::MouseButtonPress
-
- //第三步:子级窗口event执行事件分发
- zxWidget::event QEvent::MouseButtonPress
-
- //第四步:子级窗口执行事件
- zxWidget::mousePressEvent
解决方案:添加event->ignore();表示将事件继续传输给父级节点。
- void zxWidget::keyPressEvent(QKeyEvent *event)
- {
- qDebug()<< this->objectName()<<" keyPress"<<endl;
- QWidget::keyPressEvent(event);
- event->ignore();
- }
此时的输出:
- notify: "eventTestWidgetWindow" QEvent::MouseButtonPress
-
- notify: "widget" QEvent::MouseButtonPress
-
- eventTestWidget::eventFilter widget QEvent::MouseButtonPress
-
- zxWidget::event QEvent::MouseButtonPress
-
- zxWidget::mousePressEvent
-
- eventTestWidget::event QEvent::MouseButtonPress
-
- eventTestWidget::mousePressEvent
解决方案:筛选出指定事件后,返回True;
- bool zxApplication::notify(QObject *obj, QEvent *e)
- {
- if(e->type() == QEvent::MouseButtonPress)
- {
- qDebug()<<"notify: "<<obj->objectName()<<" "<<e->type()<<endl;
- return true;
- }
- return QApplication::notify(obj, e);
- }
此时输出
notify: "eventTestWidgetWindow" QEvent::MouseButtonPress
*若在QApplication的notify函数中对某个事件进行了拦截,则eventFilter中不会在接收到此函数。子对象也不会接收到该事件的通知。
解决方案:
- bool eventTestWidget::eventFilter(QObject *obj, QEvent *ev)
- {
- if(obj == ui->widget && ev->type()==QEvent::MouseButtonPress)
- {
- qDebug()<<"eventTestWidget::eventFilter widget "<< ev->type()<<endl;
- return true;
- }
-
- return QWidget::eventFilter(obj, ev);
- }
此时输出
notify: "eventTestWidgetWindow" QEvent::MouseButtonPress notify: "widget" QEvent::MouseButtonPress eventTestWidget::eventFilter widget QEvent::MouseButtonPress*在父级的eventFilter中进行事件拦截,则该事件不会传输至子对象。
解决方法
- bool zxWidget::event(QEvent *event)
- {
- qDebug()<<"zxWidget::event "<< event->type()<<endl;
- if(event->type()==QEvent::MouseButtonPress)
- {
- return true;
- }
- return QWidget::event(event);
- }
此时输出
notify: "eventTestWidgetWindow" QEvent::MouseButtonPress notify: "widget" QEvent::MouseButtonPress eventTestWidget::eventFilter widget QEvent::MouseButtonPress zxWidget::event QEvent::MouseButtonPress*在事件分发时进行事件拦截,故而没有执行该事件。
该文主要介绍了QT中事件的传输和拦截机制。
关联资源:QT开发+Event事件机制+事件监控、传输、过滤和分发机制资源-CSDN文库
小伙伴可以联系我获取哦
感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!
你的赞赏是我的最最最最大的动力(^U^)ノ~YO
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。