【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函数

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);
}

eventTestWidget

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);
}

  zxWidget的eventFilter函数

        重写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  

问题1:子级执行了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  

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

解决方案:筛选出指定事件后,返回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中不会在接收到此函数。子对象也不会接收到该事件的通知。

问题3:如何在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中进行事件拦截,则该事件不会传输至子对象。

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

解决方法

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/120724.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

长假,GPT来敲(Jué)门(Fén)

引 马上十一了&#xff0c;本拐在干了XX和XX事情以后&#xff0c;开始划水&#xff0c;欢天喜地的等放假。 然后&#xff0c;GPT4说更新了&#xff0c;据说加了一个读图的功能&#xff0c;本拐不以为然&#xff0c;不就是什么文生图&#xff0c;图生文么&#xff0c;TOOOLD。 不…

QT按钮介绍

目录 按钮基类 QAbstractButton QPushButton QToolButton QRadioButton QCheckBox 按钮基类 QAbstractButton 这是按钮的基类&#xff0c;它是继承QWidget类 它可对当前的图标&#xff0c;标题等进行设置。 它有自己的一些信号与槽函数&#xff1a; /* 当按钮被激活时(即…

HBase高阶(一)基础架构及存储原理

一、HBase介绍 简介 HBase是Hadoop生态系统中的一个分布式、面向列的开源数据库&#xff0c;具有高可伸缩性、高性能和强大的数据处理能力。广泛应用于处理大规模数据集。 HBase是一种稀疏的、分布式、持久的多维排序map 稀疏&#xff1a;对比关系型数据库和非关系型数据库&a…

正则表达式的应用(前端写法)

文章目录 1、匹配字符串中&#xff0c;a标签的href值2、校验邮箱3、校验手机号码3、待添加... 1、匹配字符串中&#xff0c;a标签的href值 (1) 代码 /*** description 匹配字符串中&#xff0c;a标签的href值* param {string} str 匹配的字符串* return {Array} 返回href值*/…

【接口测试】HTTP协议

一、HTTP 协议基础 HTTP 简介 HTTP 是一个客户端终端&#xff08;用户&#xff09;和服务器端&#xff08;网站&#xff09;请求和应答的标准&#xff08;TCP&#xff09;。通常是由客户端发起一个请求&#xff0c;创建一个到服务器的 TCP 连接&#xff0c;当服务器监听到客户…

手机搜狗输入法,输入拼音时如何分割拼音,调出“分词“功能,如何微信或QQ使用发送按钮而不是换行?

背景 有时候打字&#xff0c;输入 “xian” 的时候我们的意图是 “xi’an” &#xff08;西安&#xff09;&#xff0c;或者输入 “yue” 的时候希望是 “yu’e”&#xff08;余额&#xff09; 如何输入这个分隔符 ’ 呢&#xff1f; 设置方法 默认页面如图 希望设置成 点…

2023年【起重信号司索工(建筑特殊工种)】考试总结及起重信号司索工(建筑特殊工种)模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重信号司索工(建筑特殊工种)考试总结是安全生产模拟考试一点通生成的&#xff0c;起重信号司索工(建筑特殊工种)证模拟考试题库是根据起重信号司索工(建筑特殊工种)最新版教材汇编出起重信号司索工(建筑特殊工种)仿…

计算机网络 实验二 交换机的基本配置

实验二 交换机的基本配置 实验目的 • 掌握交换机的配置方式及切换命令&#xff1b; • 掌握交换机端口的基本配置&#xff1b; • 掌握交换机mac地址的查看与管理方法。 实验设备 以太网交换机一台服务器一台PC机五台配置电缆、网线若干 网络拓扑及IP地址分配 给计算…

腾讯云16核CPU服务器配置大全,CVM和轻量服务器

腾讯云16核CPU服务器有哪些配置可以选择&#xff1f;可以选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xf…

OpenCV 实现 SIFT→SURF 算法关键点检测实现

目录 1&#xff0c;SIFT算法原理 1.1&#xff0c;基本流程 1.1.1 尺度空间极值检测 1.1.2 关键点定位 1.1.3 关键点方向确定 1.1.4 关键点描述 1.1.5 总结 1.2 SURF原理 2 代码实现 3 结果展示 4&#xff0c;你肯定会遇到报错 cv2.error: OpenCV(3.4.8) C…

Python相关知识点

读取zip文件 import zipfilelistAipInfo zipfile.ZipFile(xxx.zip, r) print(listZipInfo.namelist()) # 以列表列出所有压缩文件列出所有被压缩的文件&#xff0c;以及文件名、文件大小和压缩结果大小。 for info in listZipInfo.infolist():print(info.filename, info.…

Android widget 小部件使用指南强化版

Android widget 小部件使用指南强化版 一、简单UI的小部件二、含集合的小部件三、可配置的小部件四、可控制的小部件五、Android 12 Widget 更新 小部件是主屏幕定制的一个重要方面。您可以将它们视为应用程序最重要的数据和功能的“概览”视图&#xff0c;这些数据和功能可以直…