QT笔记——QT自定义事件

我们有时候想发送自定义事件

1:创建自定义事件,首先我们需要知道它的条件

1:自定义事件需要继承QEvent
2:事件的类型需要在 QEvent::User 和 QEvent::MaxUser 范围之间,在QEvent::User之前 是预留给系统的事件
3:使用sendEvent() 和 postEvent()发送自定义消息
4:接受自定义消息,通过 重写 customEvent 或者 使用 eventFilter事件 来处理

2:注册自定义事件ID

在注册自定义事件的时候我们有两种方法
一:使用QEvent::registerEventType(),这个是系统会帮助我们注册ID,如果错误 返回-1
二:我们自定义 取QEvent::User 和QEvent::MaxUser 之间的值

在这里插入图片描述

方法一:
QEvent::Type CustomEvent::m_eventType = (QEvent::Type)QEvent::registerEventType();方法二:
const int CustomEventBaseID = QEvent::User;
const int TextEventID = CustomEventBaseID + 1;

3:自定义事件

class CustomEvent :public QEvent
{
public:CustomEvent();virtual ~CustomEvent();static QEvent::Type eventType();
private:static QEvent::Type m_eventType;
};
QEvent::Type CustomEvent::m_eventType = (QEvent::Type)QEvent::registerEventType();//1、注册自定义事件类型CustomEvent::CustomEvent():QEvent(eventType()) //2、指定事件类型
{}CustomEvent::~CustomEvent()
{}QEvent::Type CustomEvent::eventType()
{return m_eventType;
}

4:发送自定义事件

postEvent 方法:异步发送,向事件队列中 的发送一个指定接受者事件
不需要手动释放事件的内存,QT框架自动释放

在这里插入图片描述

sendEvent方法:此方法是阻塞发送的,它发送对象事件,等待对象处理结束返回;
需要手动释放事件的内存

在这里插入图片描述

5:自定义事件处理

写自定义事件 void customEvent(QEvent* event) override;

写事件过滤器 bool eventFilter(QObject* watched, QEvent* event) override;
还需要将对象添加到事件过滤器中

源码:
.h

#pragma once#include <QtWidgets/QWidget>
#include "ui_CustomEventTest.h"
#include <QEvent>
#include <QDebug>//自定义事件
class CustomEvent :public QEvent
{
public:CustomEvent();virtual ~CustomEvent();void SetText(const QString& str);QString GetText() const;void SetNumber(int number);int GetNumber() const;static QEvent::Type eventType();
private:QString m_str;int m_number;static QEvent::Type m_eventType;
};class CustomTwoEvent :public QEvent
{
public:CustomTwoEvent();virtual ~CustomTwoEvent();void SetStr(const QString& str);QString GetStr() const;void SetNumber(int number);int GetNumber() const;
private:QString m_str;int m_number;};//测试自定义事件
class CustomEventTest : public QWidget
{Q_OBJECTpublic:CustomEventTest(QWidget *parent = nullptr);~CustomEventTest();private slots://测试自定义事件一void on_btn1_1_clicked();void on_btn2_1_clicked();void on_btn3_1_clicked();void on_btn4_1_clicked();protected:void customEvent(QEvent* event) override;private slots://测试自定义事件二void on_btn5_1_clicked();void on_btn6_1_clicked();void on_btn7_1_clicked();void on_btn8_1_clicked();protected:bool eventFilter(QObject* watched, QEvent* event) override;private:Ui::CustomEventTestClass ui;
};

.cpp

#include "CustomEventTest.h"/************************自定义事件一********************************/
QEvent::Type CustomEvent::m_eventType = (QEvent::Type)QEvent::registerEventType();//1、注册自定义事件类型CustomEvent::CustomEvent():QEvent(eventType()) //2、指定事件类型
{}CustomEvent::~CustomEvent()
{}void CustomEvent::SetText(const QString& str)
{m_str = str;
}QString CustomEvent::GetText() const
{return m_str;
}void CustomEvent::SetNumber(int number)
{m_number = number;
}int CustomEvent::GetNumber() const
{return m_number;
}QEvent::Type CustomEvent::eventType()
{return m_eventType;
}/************************自定义事件一********************************//************************自定义事件二********************************/const int CustomEventBaseID = QEvent::User;
const int TextEventID = CustomEventBaseID + 1;CustomTwoEvent::CustomTwoEvent():QEvent(QEvent::Type(TextEventID))
{}CustomTwoEvent::~CustomTwoEvent()
{}void CustomTwoEvent::SetStr(const QString& str)
{m_str = str;
}QString CustomTwoEvent::GetStr() const
{return m_str;
}void CustomTwoEvent::SetNumber(int number)
{m_number = number;
}int CustomTwoEvent::GetNumber() const
{return m_number;
}/************************自定义事件二********************************//************************测试自定义事件********************************/
CustomEventTest::CustomEventTest(QWidget *parent): QWidget(parent)
{ui.setupUi(this);qApp->installEventFilter(this);
}CustomEventTest::~CustomEventTest()
{}void CustomEventTest::on_btn1_1_clicked()
{QString str = QStringLiteral("自定义事件一 我是post 发送指针");CustomEvent* event = new CustomEvent;event->SetText(str);event->SetNumber(1);qApp->postEvent(this, event);
}void CustomEventTest::on_btn2_1_clicked()
{QString str = QStringLiteral("自定义事件一  我是post 发送局部变量");CustomEvent event;event.SetText(str);event.SetNumber(2);//会出现崩溃qApp->postEvent(this, &event);
}void CustomEventTest::on_btn3_1_clicked()
{QString str = QStringLiteral("自定义事件一  我是send 发送指针");CustomEvent* event = new CustomEvent;event->SetText(str);event->SetNumber(3);qApp->sendEvent(this, event);delete event;
}void CustomEventTest::on_btn4_1_clicked()
{QString str = QStringLiteral("自定义事件一  我是send 发送局部变量");CustomEvent event;event.SetText(str);event.SetNumber(4);qApp->sendEvent(this, &event);
}void CustomEventTest::on_btn5_1_clicked()
{QString str = QStringLiteral("自定义事件二  我是post 发送指针");CustomTwoEvent* event = new CustomTwoEvent;event->SetStr(str);event->SetNumber(5);qApp->postEvent(this, event);
}void CustomEventTest::on_btn6_1_clicked()
{QString str = QStringLiteral("自定义事件二  我是post 发送局部变量");CustomTwoEvent event;event.SetStr(str);event.SetNumber(6);//会出现崩溃qApp->postEvent(this, &event);
}void CustomEventTest::on_btn7_1_clicked()
{QString str = QStringLiteral("自定义事件二  我是send 发送指针");CustomTwoEvent* event = new CustomTwoEvent;event->SetStr(str);event->SetNumber(7);qApp->sendEvent(this, event);delete event;
}void CustomEventTest::on_btn8_1_clicked()
{QString str = QStringLiteral("自定义事件二  我是send 发送局部变量");CustomTwoEvent event;event.SetStr(str);event.SetNumber(8);qApp->sendEvent(this, &event);
}void CustomEventTest::customEvent(QEvent* event)
{if (event->type() == CustomEvent::eventType()){CustomEvent* e = dynamic_cast<CustomEvent*>(event);if (e->GetNumber() == 1)ui.btn1->setText(e->GetText());else if (e->GetNumber() == 2)ui.btn2->setText(e->GetText());else if (e->GetNumber() == 3)ui.btn3->setText(e->GetText());else if (e->GetNumber() == 4)ui.btn4->setText(e->GetText());}
}bool CustomEventTest::eventFilter(QObject* watched, QEvent* event)
{if (event->type() == TextEventID){CustomTwoEvent* e = dynamic_cast<CustomTwoEvent*>(event);if (e->GetNumber() == 5)ui.btn5->setText(e->GetStr());else if (e->GetNumber() == 6)ui.btn6->setText(e->GetStr());else if (e->GetNumber() == 7)ui.btn7->setText(e->GetStr());else if (e->GetNumber() == 8)ui.btn8->setText(e->GetStr());event->accept();}return QWidget::eventFilter(watched,event);
}
/************************测试自定义事件********************************/

错误:在上面的代码中,当我们post 局部变量的时候会出现错误

QCoreApplication::removePostedEvent: Event of type 65535 deleted while posted to CustomEventTest CustomEventTestClass

原因:postEvent 只能在堆上创建,系统会自动释放

参考博客:
Qt 自定义事件
Qt中的事件- 自定义事件
Qt事件:自定义事件

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

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

相关文章

前端先行模拟接口(mock+expres+json)

目录 mock模拟数据&#xff1a;data/static.js 路由&#xff1a;index.js 服务器&#xff1a;server.js yarn /node 启动服务器&#xff1a;yarn start 客户端&#xff1a;修改代理路径(修改设置后都要重启才生效) 示例 后端框架express构建服务器 前端发起请求 静态数…

smtplib.SMTPHeloError: (500, b‘Error: bad syntax‘)

如果你编写邮件收发工具的时候,有可能会遇到这个问题。这里直接给出解决办法。 目录 1、检查系统版本 2、点击右侧的更改适配器选项

0基础学C#笔记08:插入排序法

文章目录 前言一、过程简单描述&#xff1a;二、代码总结 前言 我们在玩打牌的时候&#xff0c;你是怎么整理那些牌的呢&#xff1f;一种简单的方法就是一张一张的来&#xff0c;将每一张牌插入到其他已经有序的牌中的适当位置。当我们给无序数组做排序的时候&#xff0c;为了…

十九、docker学习-Dockerfile

Dockerfile 官网地址 https://docs.docker.com/engine/reference/builder/Dockerfile其实就是我们用来构建Docker镜像的源码&#xff0c;当然这不是所谓的编程源码&#xff0c;而是一些命令的集合&#xff0c;只要理解它的逻辑和语法格式&#xff0c;就可以很容易的编写Docke…

为什么DNS协议运行在UDP之上?

DNS (Domain Name System) 运行在 UDP (User Datagram Protocol) 上主要是出于以下原因&#xff1a; 简单性和效率&#xff1a;UDP 是无连接的&#xff0c;这意味着与建立和维护 TCP 连接相比&#xff0c;UDP 有更少的开销。当 DNS 查询被发送时&#xff0c;它只需要一个小的请…

[ MySQL ] — 数据库环境安装、概念和基本使用

目录 安装MySQL 获取mysql官⽅yum源 安装mysql yum 源 安装mysql服务 启动服务 登录 方法1&#xff1a;获取临时root密码 方法2&#xff1a;无密码 方法3&#xff1a;跳过密码认证 配置my.cnf 卸载环境 设置开机启动(可以不设) 常见问题 安装遇到秘钥过期的问题&…

创建型设计模式:4、建造者模式(Builder Pattern)

目录 1、建造者模式含义 2、建造者模式的讲解 3、使用C实现建造者模式的实例 4、建造者模式的优缺点 5、建造者模式VS工厂模式 1、建造者模式含义 The intent of the Builder design pattern is to separate the construction of a complex object from its representatio…

时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测

时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测 目录 时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-BiGRU-Attention时间序列预测&#xff0c;CNN-BiGRU-Attention结合注意力机制时…

详解如何计算字符中的字节数

文章目录 字符概念转义 进制的表示前缀区分后缀区分 什么是ASCII产生表述局限性字节计算 什么是Unicode编码方式UCS-2UCS-4 实现方式UTF的字节序和BOM字节计算 JavaScript中使用字符字符使用缺陷规避字符使用缺陷 MIME 编码Base64编码字节计算QP(Quote-Printable) 总结 字符概念…

触控触感方案原厂18按键触摸芯片电路图

VK3618I具有18个触摸按键&#xff0c;可用来检测外部触摸按键上人手的触摸动作。该芯片具有较 高的集成度&#xff0c;仅需极少的外部组件便可实现触摸按键的检测。 提供了2组I2C输出功能&#xff0c;1个INT中断输出脚&#xff0c;2组I2C脚和INT可并联&#xff0c;每组单键输出…

Prometheus流程图(自绘)-核心组件-流程详解

阿丹手绘流程图&#xff1a;图片可能有点小查看的时候放大看看哈&#xff01; prometheus核心组件 prometheus server Prometheus Server是Prometheus组件中的核心部分&#xff0c;负责实现对监控数据的获取&#xff0c;存储以及查询。Prometheus Server可以通过静态配置管理…

【MySQL】创建高级联结

目录 一、使用表别名 二、使用不同类型的联结 1.自联结 2.自然联结 3.外部联结 3.使用带聚集函数的联结 4.使用联结和联结条件 一、使用表别名 别名除了用于列名和计算字段外&#xff0c;SQL还允许给表名起别名。 起别名有两个好处&#xff1a; 一个是缩短SQL语句&am…

ROS实现机器人移动

开源项目 使用是github上六合机器人工坊的项目。 https://github.com/6-robot/wpr_simulation.git 机器人运动模型 运动模型如下所示&#xff1a;&#x1f447; 机器人运动的消息包&#xff1a; 实现思路&#xff1a;&#x1f447;   为什么要使用/cmd_vel话题。因为这…

leetcode 33.搜索旋转排序数组

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;搜索旋转排序数组 ps&#xff1a; 本题是二分查找的变形&#xff0c;旋转排序数组之后其实会形成两个有序的区间。算出平均下标先判断是否与 target 相等&#xff0c;因为这样可以减少代码的冗余。如果前者不成立则使用平…

TransNetR:用于多中心分布外测试的息肉分割的基于transformer的残差网络

TransNetR Transformer-based Residual Network for Polyp Segmentation with Multi-Center Out-of-Distribution Testing 阅读笔记 1. 论文名称 《TransNetR Transformer-based Residual Network for Polyp Segmentation with Multi-Center Out-of-Distribution Testing》 用…

AP2915DC-DC降压恒流驱动IC LED电源驱动芯片 汽车摩托电动车灯

AP2915 是一款可以一路灯串切换两路灯串的降压 恒流驱动器,高效率、外围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功 率管输出功率可达 12W&#xff0c;电流 1.2A。 AP2915 一路灯亮切换两路灯亮&#xff0c;其中一路灯亮可 以全亮&a…

【C++11】列表初始化 | decltype操作符 | nullptr | STL的更新

文章目录 一.列表初始化1. 花括号初始化2. initializer_list 二.decltype三.nullptr四.STL的更新1.STL新增容器2.字符串转换函数3.容器中的一些新方法 一.列表初始化 1. 花括号初始化 { }的初始化 C98中&#xff0c;标准允许使用大括号{}对数组或者结构体元素进行统一的列表初…

竞赛项目 深度学习花卉识别 - python 机器视觉 opencv

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &a…

【Linux】网络编程套接字

文章目录 网络编程套接字1. 认识TCP协议2. 认识UDP协议3. 网络字节序4. socket编程接口4.1 sockaddr 结构 5. 简单的UDP网络程序6. 简单的TCP网络程序6.1 TCP socket的封装6.2 TCP协议通讯流程 网络编程套接字 1. 认识TCP协议 传输层协议有连接可靠传输面向字节流 2. 认识UD…

php通过各种函数判断0和空php实例

php通过各种函数判断0和空php实例 本文给大家介绍php同各种函数判断0和空的方法&#xff0c;在文章给大家补充介绍了php 语法里0不等于null为空的解决办法 补充&#xff1a;下面给大家介绍下php 语法里0不等于null为空的解决办法 今天遇到这样一个问题是这样的: php 语句里,我…