当前位置:   article > 正文

【QT】QT事件Event大全_qevent

qevent

很高兴在雪易的CSDN遇见你 ,给你糖糖

欢迎大家加入雪易社区-CSDN社区云 


前言

本文分享QT中的事件Event技术,主要从QT事件流程和常用QT事件方法等方面展开,希望对各位小伙伴有所帮助!

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的点赞就是我的动力(^U^)ノ~YO

目录

前言

1. QEvent事件概述

2.代码说明事件执行流程

QApplication的notify函数

eventTestWidget

  zxWidget的eventFilter函数

问题1:子级执行了mousePressEvent,而父级未执行

问题2:如何在notify进行事件拦截

问题3:如何在eventFilter中进行事件拦截

问题4:如何在event中进行拦截

结论:


1. QEvent事件概述

        QEvent是QT中所有事件的基类,包括鼠标事件、键盘事件、QPaintEvent重绘事件、Timer事件、Drop事件。

        事件的执行过程:由QApplication对象的exec事件循环监听整个界面中所有控件的发生的事件Event。当某个控件产生相关事件后,QApplication对象会执行notify函数,向此控件发送通知。控件收到事件通知后,会进行事件过滤(eventFilter)和事件分发(event)最后到达事件处理函数。

2.代码说明事件执行流程

以Widget为例进行说明

QApplication的notify函数

        重写notify函数

  1. bool zxApplication::notify(QObject *obj, QEvent *e)
  2. {
  3. if(e->type() == QEvent::MouseButtonPress)
  4. {
  5. qDebug()<<"notify: "<<obj->objectName()<<" "<<e->type()<<endl;
  6. //return true;
  7. }
  8. return QApplication::notify(obj, e);
  9. }

eventTestWidget

  1. void eventTestWidget::mousePressEvent(QMouseEvent *ev)
  2. {
  3. qDebug()<<"eventTestWidget::mousePressEvent "<<endl;
  4. }
  5. bool eventTestWidget::event(QEvent *event)
  6. {
  7. qDebug()<<"eventTestWidget::event "<< event->type()<<endl;
  8. return QWidget::event(event);
  9. }
  10. bool eventTestWidget::eventFilter(QObject *obj, QEvent *ev)
  11. {
  12. if(obj == ui->widget && ev->type()==QEvent::MouseButtonPress)
  13. {
  14. qDebug()<<"eventTestWidget::eventFilter widget "<< ev->type()<<endl;
  15. return false;
  16. }
  17. return QWidget::eventFilter(obj, ev);
  18. }

  zxWidget的eventFilter函数

        重写eventFilter函数

  1. void zxWidget::mousePressEvent(QMouseEvent *ev)
  2. {
  3. qDebug()<<"zxWidget::mousePressEvent "<<endl;
  4. QWidget::mousePressEvent(ev);
  5. }
  6. bool zxWidget::event(QEvent *event)
  7. {
  8. qDebug()<<"zxWidget::event "<< event->type()<<endl;
  9. return QWidget::event(event);
  10. }
  11. bool zxWidget::eventFilter(QObject *obj, QEvent *ev)
  12. {
  13. if(ev->type()==QEvent::MouseButtonPress)
  14. {
  15. qDebug()<<"zxWidget::eventFilter "<< ev->type()<<endl;
  16. return false;
  17. }
  18. return QWidget::eventFilter(obj, ev);
  19. }

当在widget中点击鼠标左键时,触发

  1. //第一步:Application的notify,接收到 mouseBottonPress事件,顺序:父级-》子级
  2. notify: "eventTestWidgetWindow" QEvent::MouseButtonPress
  3. notify: "widget" QEvent::MouseButtonPress
  4. //第二步:父级窗口eventFilter执行事件过滤
  5. eventTestWidget::eventFilter widget QEvent::MouseButtonPress
  6. //第三步:子级窗口event执行事件分发
  7. zxWidget::event QEvent::MouseButtonPress
  8. //第四步:子级窗口执行事件
  9. zxWidget::mousePressEvent

问题1:子级执行了mousePressEvent,而父级未执行

解决方案:添加event->ignore();表示将事件继续传输给父级节点。

  1. void zxWidget::keyPressEvent(QKeyEvent *event)
  2. {
  3. qDebug()<< this->objectName()<<" keyPress"<<endl;
  4. QWidget::keyPressEvent(event);
  5. event->ignore();
  6. }

此时的输出:

  1. notify:  "eventTestWidgetWindow"   QEvent::MouseButtonPress 
  2. notify:  "widget"   QEvent::MouseButtonPress 
  3. eventTestWidget::eventFilter widget  QEvent::MouseButtonPress 
  4. zxWidget::event  QEvent::MouseButtonPress 
  5. zxWidget::mousePressEvent  
  6. eventTestWidget::event  QEvent::MouseButtonPress 
  7. eventTestWidget::mousePressEvent  

问题2:如何在notify进行事件拦截

解决方案:筛选出指定事件后,返回True;

  1. bool zxApplication::notify(QObject *obj, QEvent *e)
  2. {
  3. if(e->type() == QEvent::MouseButtonPress)
  4. {
  5. qDebug()<<"notify: "<<obj->objectName()<<" "<<e->type()<<endl;
  6. return true;
  7. }
  8. return QApplication::notify(obj, e);
  9. }

此时输出

notify:  "eventTestWidgetWindow"   QEvent::MouseButtonPress 

*若在QApplication的notify函数中对某个事件进行了拦截,则eventFilter中不会在接收到此函数。子对象也不会接收到该事件的通知。

问题3:如何在eventFilter中进行事件拦截

解决方案:

  1. bool eventTestWidget::eventFilter(QObject *obj, QEvent *ev)
  2. {
  3. if(obj == ui->widget && ev->type()==QEvent::MouseButtonPress)
  4. {
  5. qDebug()<<"eventTestWidget::eventFilter widget "<< ev->type()<<endl;
  6. return true;
  7. }
  8. return QWidget::eventFilter(obj, ev);
  9. }

此时输出

  1. notify: "eventTestWidgetWindow" QEvent::MouseButtonPress
  2. notify: "widget" QEvent::MouseButtonPress
  3. eventTestWidget::eventFilter widget QEvent::MouseButtonPress

*在父级的eventFilter中进行事件拦截,则该事件不会传输至子对象。

问题4:如何在event中进行拦截

解决方法

  1. bool zxWidget::event(QEvent *event)
  2. {
  3. qDebug()<<"zxWidget::event "<< event->type()<<endl;
  4. if(event->type()==QEvent::MouseButtonPress)
  5. {
  6. return true;
  7. }
  8. return QWidget::event(event);
  9. }

此时输出

  1. notify: "eventTestWidgetWindow" QEvent::MouseButtonPress
  2. notify: "widget" QEvent::MouseButtonPress
  3. eventTestWidget::eventFilter widget QEvent::MouseButtonPress
  4. zxWidget::event QEvent::MouseButtonPress

*在事件分发时进行事件拦截,故而没有执行该事件。

结论:

        该文主要介绍了QT中事件的传输和拦截机制。

关联资源:QT开发+Event事件机制+事件监控、传输、过滤和分发机制资源-CSDN文库

小伙伴可以联系我获取哦

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的赞赏是我的最最最最大的动力(^U^)ノ~YO

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/838977
推荐阅读
  

闽ICP备14008679号