【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.mzph.cn/news/87884.shtml

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

相关文章

C# string stringbuilder区别

在C#中&#xff0c;有三个主要的字符串类型&#xff0c;分别是string、StringBuffer和StringBuilder。这些类型之间有一些重要的区别&#xff1a; string&#xff1a; string 是C#中的字符串类型&#xff0c;是不可变的。这意味着一旦创建了一个字符串对象&#xff0c;就不能修…

如何搭建数据驱动自动化测试框架?

前言 说到数据驱动自动化测试&#xff0c;你会不会有这样的疑问&#xff1a;数据怎么管理&#xff1f;数据怎么才能驱动测试用例执行&#xff1f;到底怎么样才算数据驱动&#xff1f;那么本篇文章就教你如何进行数据驱动测试&#xff0c;相信你一定能对数据驱动自动化测试有一…

Android AMS——ActivityThread解析(四)

一、ActivityThread简介 ActivityThread 是Android 系统中的一个关键类,它是应用程序的入口点,并且负责启动和管理应用程序的主线程以及处理与UI相关的操作。下面是关于 ActivityThread 的一些简介: 应用程序的启动:当用户启动一个应用程序时,Android系统会创建一个新的进…

FlashDuty Changelog 2023-09-21 | 自定义字段和开发者中心

FlashDuty&#xff1a;一站式告警响应平台&#xff0c;前往此地址免费体验&#xff01; 自定义字段 FlashDuty 已支持接入大部分常见的告警系统&#xff0c;我们将推送内容中的大部分信息放到了 Lables 进行展示。尽管如此&#xff0c;我们用户还是会有一些扩展或定制性的需求…

设计模式:享元模式(C++实现)

享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构设计模式&#xff0c;它通过共享对象来有效地支持大量细粒度的对象。享元模式的目标是尽量减少内存使用&#xff0c;通过共享相同的数据来减少对象的数量。 以下是一个简单的C享元模式的示例&#xff1a; #includ…

网络安全--防火墙旁挂部署方式和高可靠性技术

目录 一、防火墙 二、防火墙旁挂部署方式 使用策略路由实现 第一步、IP地址配置 第二步、配置路由 第三步、在防火墙上做策略 第四步、在R2上使用策略路由引流 三、防火墙高可靠性技术--HRP 拓扑图 第一步、配置SW1、SW2、FW1、FW2 第二步、进入防火墙Web页面进行配…

基于Python的微博舆论分析,微博情感分析可视化系统(V2.0)

简介 Python基于微博的舆情分析&#xff0c;情感分析可视化系统 微博舆情分析系统&#xff0c;项目后端分爬虫模块、数据分析模块、数据存储模块、业务逻辑模块组成。 功能包括 登陆注册用户管理热门事件展示舆情分析&#xff0c;包括舆情分析&#xff0c;情感分类&#xff0…

程序运行过程中消耗的是堆内存还是栈内存还是其他?

程序在运行过程中会使用多种类型的内存&#xff0c;其中最常见的是堆内存和栈内存。下面是对它们的简要描述&#xff0c;以及它们在程序中的用途&#xff1a; 栈内存 (Stack Memory)&#xff1a; 当函数调用发生时&#xff0c;栈用于存储局部变量、函数参数和返回地址。栈是后进…

2023最新PS(photoshop)Win+Mac免费下载安装包及教程内置AI绘画-网盘下载

2023最新PS(photoshop)WinMac免费下载安装包及教程内置AI绘画-网盘下载 2023最新PS(photoshop)免费下载安装教程来咯&#xff5e; 「PhotoShop」全套&#xff0c;winmac&#xff1a; https://pan.quark.cn/s/9d8d8ef5c400#/list/share 所有版本都有 1&#xff0c;复制链接…

400G QSFP-DD FR4 与 400G QSFP-DD FR8光模块:哪个更适合您的网络需求?

QSFP-DD 光模块随着光通信市场规模的不断增长已成为400G市场中客户需求量最高的产品。其中400G QSFP-DD FR4和400G QSFP-DD FR8光模块都是针对波分中距离传输&#xff08;2km&#xff09;的解决方案&#xff0c;它们之间有什么不同&#xff1f;应该如何选择应用&#xff1f;飞速…

安卓生成公钥和md5签名

安卓公钥和md5证书签名 大家好&#xff0c;最近需要备案app&#xff0c;用到了公钥和md5&#xff0c;MD5签名我倒是知道&#xff0c;然而对于公钥却一下子不知道了&#xff0c; 现在我讲一下我的流程。 首先是md5证书签名的查看&#xff0c; 生成了apk和签名.jks后&…

Oracle 12c Docker镜像配置SSL

一、Docker运行Oracle 12c服务 a.拉取镜像 docker pull truevoly/oracle-12cb.运行 docker run -d -p 1521:1521 -p 2484:2484 -v /data/oracle/:/opt/oracle --name oracle_12c truevoly/oracle-12cc.查看日志 docker logs -f oracle_12cd.出现如下信息&#xff0c;则启动…

makefile中常见函数应用例子

makefile中常见函数应用例子 1&#xff09;subst函数&#xff1a; subst函数用于字符串替换。以下是一个示例&#xff1a; $(subst ee,EE,feet on the street)2&#xff09;patsubst函数&#xff1a; patsubst函数用于模式字符串替换。以下是一个示例&#xff1a; $(patsubst…

华为多路径软件UltraPath

检查多路径是否安装。 # rpm -qa|grep UltraPath 查看UltraPath软件版本 # upadmin show version 查看物理路径状态。 #upadmin show path 查看虚拟磁盘信息。 #upadmin show vlun 查看逻辑路径状态。 #upadmin show vlun 查看多路径配置。 #upadmin show upconfig 卸载Ul…

解释器模式简介

概念&#xff1a; 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于定义语言的文法&#xff0c;并解析和执行给定语言中的表达式。该模式将每个表达式表示为一个类&#xff0c;并提供了一种方式来组合这些表达式以实现复杂的语句…

竞赛选题 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

Spring常考知识点(IOC、事务、容器等)

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; Spring需要理解的问…

LeetCode 169. 多数元素

文章目录 一、题目二、Java 题解 一、题目 给定一个大小为 n 的数组 nums&#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 点击此处跳转题目。 示例 1&#xff…

ubuntu下网卡插入网线后仍然不连接

网卡驱动已经安装&#xff0c;在settings里可以看到该网卡设备&#xff0c;但是插入网线后仍然不会连接&#xff1a; 鼠标点击也无效。 可尝试&#xff1a; 1. ifconfig找到该网卡&#xff0c;比如我的网卡是 enx0826ae3e81aa 2. sudo ifconfig enx0826ae3e81aa down sud…

JavaScript 基础第三天笔记

JavaScript 基础第三天笔记 if 多分支语句和 switch的区别&#xff1a; 共同点 都能实现多分支选择&#xff0c; 多选1大部分情况下可以互换 区别&#xff1a; switch…case语句通常处理case为比较确定值的情况&#xff0c;而if…else…语句更加灵活&#xff0c;通常用于范围…