• 【QT】QT事件Event大全


    很高兴在雪易的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: "<objectName()<<" "<type()<
    6. //return true;
    7. }
    8. return QApplication::notify(obj, e);
    9. }

    eventTestWidget

    1. void eventTestWidget::mousePressEvent(QMouseEvent *ev)
    2. {
    3. qDebug()<<"eventTestWidget::mousePressEvent "<
    4. }
    5. bool eventTestWidget::event(QEvent *event)
    6. {
    7. qDebug()<<"eventTestWidget::event "<< event->type()<
    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()<
    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 "<
    4. QWidget::mousePressEvent(ev);
    5. }
    6. bool zxWidget::event(QEvent *event)
    7. {
    8. qDebug()<<"zxWidget::event "<< event->type()<
    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()<
    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"<
    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: "<objectName()<<" "<type()<
    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()<
    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()<
    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

  • 相关阅读:
    prometheus+springboot监控项目状态
    java计算机毕业设计校园二手交易平台源码+系统+mysql数据库+lw文档+部署
    软件工程毕业设计课题(36)基于JAVA毕业设计JAVA新冠疫苗预约系统毕设作品项目
    Excel_VBA程序文件的加密及解密说明
    【C++】简单理解:将整数(浮点数)转换为字符串(string),将字符串(string)转换为整数(浮点数)方法
    Vue基础入门(四):Vue3快速开发模板
    JavaScript设计模式中的装饰者模式
    想要精通算法和SQL的成长之路 - 最长连续序列
    十三、函数式编程(3)
    智能恒等于推荐系统
  • 原文地址:https://blog.csdn.net/qq_40041064/article/details/133271546