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_OBJECT

public:
    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事件:自定义事件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python免费下载安装教程,python编程软件 免安装

本篇文章给大家谈谈python免费下载安装教程&#xff0c;以及python编程软件 免安装&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 百度网盘 请输入提取码 提取码: wifx 下载好记得把python文件解压&#xff0c;里面有32位和64位的&#xff0c;根据自己配置…

【工作中问题解决实践 十】一次内存泄露排查-MAT使用指南

最近体验了一把当医生的感觉&#xff0c;定位病根病因&#xff0c;感觉这种要揪出问题的感觉很爽&#xff0c;并不觉得麻烦&#xff0c;这里将整个排查过程记录一下&#xff0c;方便之后再遇到类似问题有应对之道。 问题背景 2023-07-18 早上还在睡梦中的俺被一条条报警消息铛…

Spring事务管理

1.什么是事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;这些操作要么一起成功&#xff0c;要么一起失败&#xff0c;是一个不可分割的工作单元。 涉及到事务的场景非常多&#xff0c;一个 service 中往往需要调用不同的 dao 层方法&#xff0c;这些方法…

区块链技术助力慈善,为您的善举赋予全新力量!

我们怀揣着一颗温暖的心&#xff0c;秉承着公开透明的理念&#xff0c;带着信任与责任&#xff0c;倾力打造了一套区块链技术驱动的去中心化捐赠与物资分发系统&#xff0c;通过智能生态网络&#xff08;IEN&#xff09;解决捐赠不透明问题的系统&#xff0c;让您的善举直接温暖…

Linux命令200例:cd用于改变当前工作目录(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

【Rust】Rust学习 第五章使用结构体组织相关联的数据

5.1 定义结构体并实例化结构体 定义结构体&#xff0c;需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着&#xff0c;在大括号中&#xff0c;定义每一部分数据的名字和类型&#xff0c;我们称为 字段&#xff08;field&…

数据结构--最小生成树

数据结构–最小生成树 连通图 \color{red}连通图 连通图的生成树是 包含图中全部顶点的一个极小连通子图 \color{red}包含图中全部顶点的一个极小连通子图 包含图中全部顶点的一个极小连通子图。 若图中顶点数为n&#xff0c;则它的生成树含有 n-1 条边。对生成树而言&#xff…

断路器回路电阻试验

试验目的 断路器回路电阻主要取决于断路器动、 静触头的接触电阻, 其大小直接影响正常 运行时的发热情况及切断短路电流的性能, 是反应安装检修质量的重要数据。 试验设备 回路电阻测试仪 厂家&#xff1a; 湖北众拓高试代销 试验接线 对于单断口的断路器, 通过断口两端的接线…

WebRTC 之音视频同步

在网络视频会议中&#xff0c; 我们常会遇到音视频不同步的问题&#xff0c; 我们有一个专有名词 lip-sync 唇同步来描述这类问题&#xff0c;当我们看到人的嘴唇动作与听到的声音对不上的时候&#xff0c;不同步的问题就出现了 而在线会议中&#xff0c; 听见清晰的声音是优先…

redis 集群 2:分而治之 —— Codis

在大数据高并发场景下&#xff0c;单个 Redis 实例往往会显得捉襟见肘。首先体现在内存上&#xff0c;单个 Redis 的内存不宜过大&#xff0c;内存太大会导致 rdb 文件过大&#xff0c;进一步导致主从同步时全量同步时间过长&#xff0c;在实例重启恢复时也会消耗很长的数据加载…

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…

前沿分享-鱼形机器人

可能并不太前沿了&#xff0c;是21年底的新闻了&#xff0c;但是看见了就顺便发一下吧。 大概就是&#xff0c;通过在pH响应型水凝胶中编码不同的膨胀速率而构建了一种环境适应型变形微机器人,让微型机器人直接向癌细胞输送药物从而减轻药物带来副作用。 技术原理是&#xff0c…

【51单片机】晨启科技,7针OLED显示驱动程序,STC89C52RC

文章目录 原理图oled.coled.hmain.c 原理图 sbit OLED_SCLP4^3;//SCL-D0 sbit OLED_SDAP4^1;//SDA-D1 sbit OLED_RES P3^6;//RES sbit OLED_DC P3^7;//DC sbit OLED_CSP2^7; //CS oled.c #include "OLED.h"//******************************说明*******************…

APP外包开发的Flutter框架

Flutter 是一种流行的开源UI框架&#xff0c;由谷歌开发&#xff0c;用于构建跨平台的移动应用程序。它使用一套统一的代码库&#xff0c;可以在多个平台上&#xff08;如Android、iOS、Web、桌面等&#xff09;保持一致的外观和行为。今天和大家分享一些基于 Flutter 开发的常…

初次使用GPU云服务器

前言&#xff1a; 在体验了GPU云服务器&#xff08;GPU Cloud Computing&#xff0c;GPU&#xff09;后&#xff0c;我认为这是一个非常强大的弹性计算服务。它为深度学习、科学计算、图形可视化、视频处理等多种应用场景提供了强大的GPU算力&#xff0c;能够满足各类用户的计算…

如何使Python Docker镜像安全、快速、小巧

一、说明 在微服务领域&#xff0c;拥有安全、高效和紧凑的 Docker 映像对于成功部署至关重要。本博客将探讨有助于构建此类映像的关键因素&#xff0c;包括不以 root 用户身份运行映像的重要性、在构建映像时更新和升级包、在编写 Dockerfile 指令时考虑 Docker 的层架构&…

ZIG:理解未来编程语言的视角

文章目录 摘要&#xff1a;引言&#xff1a;性能简洁性和模块化避免常见错误和陷阱总结&#xff1a;参考资料&#x1f4d1;: 摘要&#xff1a; 本文介绍了新兴编程语言ZIG的目标和特点&#xff0c;包括高性能、简洁性和模块化&#xff0c;并分析了这些特点是如何通过语言设计来…

关于丢失安卓秘钥的撞sha-1值的办法

实验得知&#xff0c;安卓sha-1和keytool生成秘钥签名文件的时间有关。 前提条件是&#xff0c;开发者必须知道生成秘钥的所有细节参数 以下是撞文件代码&#xff08;重复生成&#xff09; import time import osidx 0while True:cmdkeytool -keyalg RSA -genkeypair -alia…

中国信通院腾讯安全发布《2023数据安全治理与实践白皮书》

导读 腾讯科技(深圳)有限公司和中国信息通信研究院云计算与大数据研究所共同编制了本报告。本报告提出了覆盖组织保障、管理流程、技术体系的以风险为核心的数据安全治理体系&#xff0c;并选取了云场景、互娱、社交等场景&#xff0c;介绍相应场景下数据安全治理实践路线及主…

26 MFC序列化函数

文章目录 Serialize对于存储文件的序列化 Serialize Serialize 是一个在 MFC (Microsoft Foundation Classes) 中常用的函数或概念。它用于将对象的数据进行序列化和反序列化&#xff0c;便于在不同的场景中保存、传输和恢复对象的状态。 在 MFC 中&#xff0c;Serialize 函数…