【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> #…

@CrossOrigin的使用

CrossOrigin的使用 1.使用场景2.用法3.示例3.1 标注在方法上3.2 标注在类上 3.属性配置 1.使用场景 前后端分离应用&#xff1a;当前端应用和后端服务部署在不同的域或端口上时&#xff0c;前端应用尝试向后端服务发起请求时&#xff0c;可能会遇到同源策略的限制。这时&#…

python开发应该具备哪些能力

Python开发能力涵盖了多个方面&#xff0c;这些能力不仅涉及Python语言本身&#xff0c;还包括与Python开发相关的技术栈、工具和方法论。以下是一些关键的Python开发能力&#xff1a; Python语言基础&#xff1a; 熟练掌握Python的语法和核心特性&#xff0c;如变量、数据类型…

常用命令合集

设置永久清华源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simpleDocker dockerfile FROM nvidia/cuda:11.8.0-devel-ubuntu20.04RUN rm -rf /var/lib/apt/lists/* RUN apt-get clean RUN apt update RUN apt upgrade -yRUN apt install vim -yRU…

【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;其中信号链包含运算放大器、比较器、模拟开关、数…

PotCSS 概述

PotCSS 并不是一个广泛认知的术语或者一个特定的技术&#xff0c;至少在提供的搜索结果中没有直接提到 PotCSS 的相关信息。因此&#xff0c;无法提供关于 PotCSS 的背景渊源介绍。 然而&#xff0c;如果你指的是 PostCSS&#xff0c;那么可以提供一些关于它的背景信息。PostC…

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

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

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

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

centos 7.9 安装 ftp 传输文件

ftp server 端 sudo yum install vsftpd ftp其中 vsftpd 为 ftp server 端&#xff0c;ftp 包含 ftp 这个客户端命令。 # sudo rpm -ql vsftpd/etc/logrotate.d/vsftpd /etc/pam.d/vsftpd /etc/vsftpd /etc/vsftpd/ftpusers /etc/vsftpd/user_list /etc/vsftpd/vsftpd.conf /…

若依学习记录

1.克隆我的gitee项目地址 https://gitee.com/xuge520/ruo-yi-vue-master.git 2.前期工作&#xff08;注意&#xff1a;我的Mysql使用的是3308端口&#xff0c;数据库名是ry-vue&#xff09; 使用若依框架RuoYi前后端分离版(超详细步骤)-CSDN博客 3.使用若依代码生成 若依代…

服务器渲染技术(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…

shell 脚本基础练习

编写脚本 sysinfo.sh&#xff0c;显示当前主机系统信息&#xff0c;包括:主机名&#xff0c;IPv4地址&#xff0c;操作系统版本&#xff0c;内核版 本&#xff0c;CPU型号&#xff0c;内存大小&#xff0c;硬盘大小 tr命令用于替换或删除字符。 cut命令用于从文件或标准输入…

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…