【QT学习】8.qt事件处理机制,事件过滤器,自定义事件

1.qt事件处理机制

        事件处理:        

        当用户移动鼠标的时候 ,创建一个   鼠标移动事件对象  然后把这个对象放到  事件队列里面去,事件管理器   从队列中 取出事件,然后 调用其对应的事件处理函数

        多态机制:

(1)默认不重写  : 调用  基类的  虚函数函数  处理

(2)重写             : 调用  派生类的  重写后的函数  处理

        一个特例:

        定时器事件    startTimer     每隔 固定时间    创建一个定时器事件对象    不会进入事件队列,直接会触发对应的定时器事件处理函数 timerEvent  去处理。   

2.事件传递的过程

3.QT本身的机制是:

        先NEW出事件对象,放到事件队列里,然后传递给当前对象的event函数,当前对象的event函数(区分类型) 调用 对应的 事件处理函数。

        如果当前对象的event函数没有处理,Return false;就会把事件对象传递给当前对象的父对象的event函数。

2.举例1:

点击label内,label的event事件响应

点击label外,label事件不响应,widget的event响应

1.创建一个label与button,都设置成自定义控件

2.label声明事件,实现事件

3.同样的,widget主页面也是那两个函数

4.结果:

点击label内,label的event事件响应

点击label外,label事件不响应,widget的event响应

3.举例2:(分别)实现以下(三个要求)

(1)label的event事件直接自己处理。

(2)label的event事件调用自身的mousePressEvent(QMouseEvent* e)函数。

(3)label的event事件忽略处理此事件,让主页面处理。

原理:事件分先后,如果处理,后面就不管它了。

总结:event优先级>mousePressEvent

        当前对象event优先级>父对象的优先级

(1)label的event事件直接自己处理。

1.本事件中直接return true;

结果:

(2)label的event事件调用自身的mousePressEvent(QMouseEvent* e)函数。

实现:

 结果:       

(3)label的event事件忽略处理此事件,让主页面处理。

实现:

结果:

二。事件过滤器

事件过滤器(Event Filter)则是一种简单的事件处理机制,它允许一个对象拦截并处理其他对象发出的特定类型的事件。事件过滤器通过重载 QObject 类中的两个函数:bool eventFilter(QObject *obj, QEvent *event) 来实现对事件的拦截和处理。当一个对象发出一个事件时,如果该事件符合当前对象正在拦截的事件类型,那么该对象就会调用 eventFilter() 函数进行处理;否则,它会继续将该事件分发给其他对象。
————————————————

原理说明可看下面文章:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/SNAKEpc12138/article/details/130850030

1.widget.h

    //注意:字体变《斜》字体,证明此函数有虚继承
void mousePressEvent(QMouseEvent *e);
bool event(QEvent *e);//事件过滤器(*)
bool eventFilter(QObject* obj,QEvent* e);

2.widget.cpp

1.提前安装事件过滤器

2.编写事件函数

//事件过滤器
bool Widget::eventFilter(QObject* obj,QEvent* e){if(obj == ui->label){if(e->type() == QEvent::MouseButtonPress){qDebug() << "事件过滤器中逮到了label的鼠标按下事件";}}else if(obj == ui->pushButton){if(e->type() == QEvent::MouseButtonPress){qDebug() << "事件过滤器中逮到了button的鼠标按下事件";}}return QWidget::eventFilter(obj,e);
}
//事件处理
bool Widget::event(QEvent *e){QEvent::Type  tp = e->type();if(tp == QEvent::MouseButtonPress){qDebug() << "Widget 类里 event函数中 鼠标点击" ;}return QWidget::event(e);
}
//鼠标按下处理函数
void Widget::mousePressEvent(QMouseEvent *event){qDebug() << "Widget 类里 mousePressEvent 函数中 鼠标点击" ;
}

2.运行结果:

注意:

1.widget的eventFilter事件过滤器,return调用(父类,即QWidget)的事件过滤器。这样会继续按qt事件机制运行。

2.(父类,即QWidget)的事件过滤器处理后,根据子对象event优先级>父对象的优先级,需要先调用button的event事件。

三。自定义事件

1.自定义事件类型的Type规定用户使用范围为1000-65535

        在QEvent::Type

2.自建事件其实就是一个(类)

1.myevent事件创建

     //规定自定义事件的type为1000+0x88
const static QEvent::Type myDefinedType = static_cast<QEvent::Type>(QEvent::User + 0x88);//explicit表示构造函数给父类支配
explicit MyDefinedEvent(QString data):QEvent(myDefinedType){m_data = data;
}
QString getData(){return m_data;}

2.widget编写事件与事件过滤器

实现:

bool Widget::eventFilter(QObject* obj,QEvent* e){//qDebug() << "我来也!";if(obj == ui->lineEdit){if(e->type() == MyDefinedEvent::myDefinedType){//把接收到的事件强转下,MyDefinedEvent自建事件其实就是一个(类)MyDefinedEvent* recvEvt = static_cast<MyDefinedEvent*>(e);QString str = recvEvt->getData();qDebug() << "接收到自定义事件:" <<str;ui->lineEdit->insert(str);//需要刷新窗口  重绘窗口的时候才会显示return true;}else{return QWidget::eventFilter(obj,e);}}return QWidget::eventFilter(obj,e);
}
//事件
bool Widget::event(QEvent *e){if(e->type() == QMouseEvent::MouseButtonDblClick){qDebug() << "进来了Widget类中的event";MyDefinedEvent evt("强哥帅");QApplication::sendEvent(ui->lineEdit,&evt);qDebug() << "发送自定义事件";}
}

总结:

        自定义事件就是创建一个类,继承QEvent。

        需要手动发送。

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

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

相关文章

【xhs爬虫软件】把小红书评论comment接口封装成GUI采集工具!

用Python开发爬虫采集软件&#xff0c;可自动抓取小红书评论数据&#xff0c;并且含二级评论。 小红书的评论接口URL是&#xff1a; https://edith.xiaohongshu.com/api/sns/web/v2/comment/page 开发者模式分析过程&#xff1a; 进而封装成GUI界面软件&#xff0c;如下&…

17.基础乐理-调式、自然大调式(C大调、D大调。。。)

调式&#xff1a; 若干个音&#xff0c;按照某种规则排列起来&#xff0c;就是调式&#xff0c;调式是一个非常大&#xff0c;非常抽象的概念&#xff0c;调式这两个字是一个统称&#xff0c;当明确了 若干个音 到底有几个音&#xff0c;某种规则到底是什么规则之后&#xff0c…

【精】Devops实战学习CI/CD落地方案#CI篇#

目录 先有个大概了解 基本概念 CI/CD Devops 阿里云效 devops产品 K8s jenkins docker git maven 知行合一&#xff0c;上手操作 实操记录 安装VMware 安装并配置虚拟机 安装并配置docker docker安装 修改镜像源&#xff08;关键且易出错&#xff09; CentOS…

Spring Security 入门篇(一)-- 简介

引言 Spring Security 官方文档 https://spring.io/projects/spring-security Spring Security 中文文档 &#xff1a; https://springdoc.cn/spring-security/ Spring Cloud 中文文档 https://www.springcloud.cc/spring-security.html#overall-architecture 一、简介 1. 什…

poll实现echo服务器的并发

poll实现echo服务器的并发 代码实现 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/time.h> #include <unistd.h> #…

【JAVA】实现只有一个窗口弹出的底层逻辑——单身模式

目录 背景说明 代码实现 手写笔记 背景说明 有的时候&#xff0c;当你点击一个选项时会弹出来多个窗口&#xff0c;而有的时候只会弹出一个。 实际上&#xff0c;弹出多个窗口就是创建了多个相同的对象&#xff0c;而只弹出一个就是我们今天即将分享的单身模式——一个类只产生…

【Python】使用Python计算简单数值积分

题外话&#xff0c;Python语言命名的来源&#xff1a;&#xff08;见下图&#xff09;Monty Python巨蟒剧团 1、积分题目&#xff08;3&#xff09; 2、解析解答 3、Python计算代码 import math import scipy.integrate as integrate# 积分区间 # x_min 0.0 # 1 # x_min …

润石科技(RUNIC)汽车电子应用方案和物料选型

一、润石科技&#xff08;RUNIC&#xff09;简介 江苏润石科技有限公司是一家专注于高性能、高品质模拟/混合信号集成电路研发和销售的高科技半导体设计公司。公司主要产品线分为两类&#xff1a;信号链和电源管理&#xff0c;其中信号链包含运算放大器、比较器、模拟开关、数…

王者荣耀防御塔如何开发!新手小白做游戏开发采坑经过。phaser前端游戏框架

好嘞&#xff0c;游戏开发框架是js 开发的网页小游戏&#xff01; phaser这个框架。好我们先上图&#xff01; 目前大概是这么一个样子。 然后防御塔功能呢。简单的说就是当人物进去的时候打他。人物扣血。 我们的小人物是这样的代码 遇到的问题如下&#xff1b; 小白刚开始…

C++从入门到精通——模板

模板 前言一、泛型编程二、函数模板函数模板的概念函数模板格式示例 函数模板的原理函数模板的实例化隐式实例化显式实例化示例 auto做模板函数的返回值模板参数的匹配原则总结 三、类模板类模板的定义格式类模板的实例化 前言 C模板是C语言中的一种泛型编程技术&#xff0c;可…

服务器渲染技术(JSPELJSTL)

目录 前言 一.JSP 1.基本介绍 3.page指令(常用) 4.JSP三种常用脚本 4.1 声明脚本 <%! code %> 4.2 表达式脚本 <% code %> 4.3 代码脚本 <% code %> 4.4 注释 <%-- 注释 --%> 5. JSP 内置对象 5.1 基本介绍 5.2 九个内置对象 6.JSP域对象 二…

Ubuntu20.04 ISAAC SIM仿真下载使用流程

机器&#xff1a;华硕天选X2024 显卡&#xff1a;4060Ti ubuntu20.04 安装显卡驱动版本&#xff1a;525.85.05 参考&#xff1a; What Is Isaac Sim? — Omniverse IsaacSim latest documentationIsaac sim Cache 2023.2.3 did not work_isaac cache stopped-CSDN博客 Is…

linux 安装openjdk-1.8

安装命令 yum install java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64查看安装路径 find / -name java 默认的安装路径 /usr/lib/jvm 查看到jre 以及java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 配置环境变量 vim /etc/profile 添加的内容 export JAVA_HOME/usr/li…

每日一题:地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…

基于非线性控制策略的电力电子电路——DC-DC电路的3种滑模控制器【MATLAB/simulink】

第一种&#xff0c;滞环滑模控制器Buck电路 在滑模控制系统中&#xff0c;采用滞环技术&#xff0c;直接将切换函数转换成开关控制信号&#xff0c;滞环技术被看做一种降低系统结构的切换频率的调制方法&#xff0c;业界也把基于滞环滑模技术实现的滑模控制称为直接滑模控制技…

分类网络总结

欢迎大家订阅我的专栏一起学习共同进步&#xff0c;主要针对25届应届毕业生 祝大家早日拿到offer&#xff01; lets go http://t.csdnimg.cn/dfcH3 目录 4. 经典分类网络与发展 4.1 AlexNet 4.2 VGGNet 4.3 GoogLeNet Inception 4.4 ResNet 4.5 DenseNet 4.6 MobileN…

Python基础04-操作系统中的文件与目录操作

在与操作系统交互时&#xff0c;我们经常需要执行文件和目录的操作。Python提供了丰富的库来帮助我们完成这些任务。以下是一些常见的操作&#xff0c;以及如何使用Python代码来实现它们。 1. 导航文件路径 在不同的操作系统中&#xff0c;文件路径的格式可能不同。Python的o…

提取出图像的感兴趣区域

这是我们的原图像 将图像的数值统计后进行条形图展示 import matplotlib.pyplot as plt from PIL import Image import numpy as np# 图像路径 image_path r"D:\My Data\Figure\OIP.jpg"# 打开图像 image Image.open(image_path)# 将图像转换为numpy数组 image_ar…

关于实验报告添加题注为0以及页面断层的解决办法

1.事情起源于最近在写实验报告和课设说明书时出现图的题注是图0-1等不遵循设置的章节标号&#xff0c;于是我在查询和个人尝试后发现必须设置多级编号并且自定义设置对应的样式为标题几 另外注意设置后必须题注也要设置对应的样式&#xff0c;否则还是0-1&#xff0c;不用编辑域…

全球30米100%水陆覆盖高程

数据是GIS的血液。 熟悉水经注的朋友都应该知道&#xff0c;我们可以为大家提供全球30米和全球12.5米的高程数据&#xff0c;但这两种数据都无法达到全球覆盖。 你可以从《40TB全球12.5米高程DEM原始数据》与《700G全球30米高程DEM原始数据》等文中了解这两种数据的详细说明。…