QT笔记——QT自定义事件

news2024/11/19 7:41:03

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

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

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

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

相关文章

[ubuntu]创建root权限的用户

一、创建新用户 1、创建新用户 sudo useradd -r -m -s /bin/bash 用户名 # -r&#xff1a;建立系统账号 -m&#xff1a;自动建立用户的登入目录 -s&#xff1a;指定用户登入后所使用的shell2、手动为用户设置密码 passwd 用户名 二、为用户增加root权限 1、添加写权限 ch…

适配器模式:将不兼容的接口转换为可兼容的接口

适配器模式&#xff1a;将不兼容的接口转换为可兼容的接口 什么是适配器模式&#xff1f; 适配器模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换为客户端所期望的另一个接口。它允许不兼容的类能够合作&#xff0c;使得原本由于接口不匹配而无法工作的类能够一…

1.Fay-UE5数字人工程导入(UE数字人系统教程)

Fay-UE5数字人工程导入 1、工程下载&#xff1a;xszyou/fay-ue5: 可对接fay数字人的ue5工程 (github.com) 2、ue5下载安装&#xff1a;Unreal Engine 5 3、ue5插件安装 依次安装以下几个插件 4、双击运行工程 5、切换中文 6、检查插件已启用 7、测试运行

一文看懂intel处理器型号

cpu型号命名 cpu 后缀 外形/功能类型/细分市场后缀优化/设计台式机K高性能&#xff0c;未锁频Φ需要独立显卡S特别版T功耗优化生活方式X/XE最高性能&#xff0c;未锁频移动设备&#xff08;笔记本电脑 2、2 合 1 电脑&#xff09;HX最高性能&#xff0c;所有 SKU 未锁频HK高性…

Python源码:使用Tkinter写一个诗词答题软件

废话不多&#xff0c;直接上源码 # 导入用到的库 import tkinter from tkinter import * from tkinter.messagebox import * import random# 准备一个诗词题库列表 shici_list [(词苑千载&#xff0c;群芳竞秀&#xff0c;盛开一枝女儿花"说的是哪位历史上的哪位才女&am…

陀螺玩具跨境电商亚马逊CPC认证

陀螺指的是绕一个支点高速转动的刚体。陀螺是中国民间最早的娱乐工具之一.形状上半部分为圆形&#xff0c;下方尖锐。从前多用木头制成&#xff0c;现代多为塑料或铁制。玩时可用绳子缠绕&#xff0c;用力抽绳&#xff0c;使直立旋转。或利用发条的弹力旋转。传统古陀螺大致是木…

移动端自动化测试实战

UI自动化测试的价值 1、提升回归测试的效率 2、可以进行兼容性测试 UI 自动化测试应用场景 • 冒烟测试自动化&#xff1a;提测之前自动断言提测质量&#xff0c;提供准入参考。 • 功能测试自动化&#xff1a;辅助 QA 与测试工程师的快速验证。 • 验收测试自动化&#xf…

大模型AI人才培养研习会,上海、武汉站同期招募!

伴随预训练大语言模型技术引发的产业变革&#xff0c;市场对AI人才需求也同样发生着深刻变化&#xff0c;教育迎来了新的机遇与挑战。由中国自动化学会主办&#xff0c;百度公司联合知名高校承办的大模型AI人才培养研习会&#xff0c;首场将于8月19日在武汉、上海双城同期举办&…

python安装xgboost报错

ERROR: Could not find a version that satisfies the requirement xgboost (from versions: none) ERROR: No matching distribution found for xgboost 解决办法&#xff1a; 换成国内的pip源 pip install xgboost -i http://pypi.doubanio.com/simple/ --trusted-host py …

python3学习--使用pandas 数据透视表分析数据--入门示例

什么是透视表&#xff1f; 透视表是一种可以对数据动态排布并且分类汇总的表格格式&#xff0c;可以以多种方式和视角查看数据特征 Pandas库提供了一个名为pivot_table的函数&#xff0c;它将一个特性的值汇总在一个整洁的二维表中。 使用示例 pivot_table函数说明 pandas.…

没有硬核技术,怎么抓得住元宇宙的风口?

自 2021 年起&#xff0c;Web 3.0 与元宇宙逐步成为全球科技界的热门概念。Web 3.0 是技术发展方向的未来&#xff0c;元宇宙是应用场景和生活方式的未来&#xff0c;二者之间是相辅相成、一体两面的依存关系。科技巨头如 Meta、谷歌、苹果、华为、腾讯、OPPO 等均已在积极布局…

7.3 详解NiN模型--首次使用多层感知机(1x1卷积核)替换掉全连接层的模型

一.前提知识 多层感知机&#xff1a;由一个输入层&#xff0c;一个或多个隐藏层和一个输出层组成。&#xff08;至少有一个隐藏层&#xff0c;即至少3层&#xff09; 全连接层&#xff1a;是MLP的一种特殊情况&#xff0c;每个节点都与前一层的所有节点连接&#xff0c;全连接…

stm32项目(6)——基于stm32的人体检测系统

目录 1.功能设计 2.硬件方案 1.单片机选择 2.人体传感器 3.报警模块 3.程序设计 4.课题意义 5.未来发展 1.功能设计 本系统为日常生活而开发的人体感应报警系统&#xff0c;主体通过HC-SR501模块达到感知人体靠近&#xff0c;检测到人体后单片机控制蜂鸣器和LE…

MyBatis动态sql标签帮你轻松搞定sql拼接

动态sql介绍 由于在开发过程不同的业务中会用到不同的操作条件&#xff0c;如果每个业务都拼接不同sql语句的话会是一个庞大的工作量&#xff1b;此时动态sql就能解决这个问题&#xff0c;可以针对不确定的操作条件动态拼接sql语句&#xff0c;根据提交的条件来完成业务sql的执…

【LeetCode 75】第二十四题(2390)从字符串中移除星号

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个字符串&#xff0c;然后字符串中包含星号*&#xff0c;要求每个星号消除一个从星号左边起最近的一个字符&#xf…

随着野火的增加,甲烷排放也会增加

2020 年对加利福尼亚州造成严重破坏的野火使大气中充满了强效温室气体。 2020 年&#xff0c;溪火烧毁了北加州的内华达山脉。图片来源&#xff1a;Zachary Cava/Flickr&#xff0c;CC BY-NC-SA 2.0 2020 年&#xff0c;在高温和干旱的推动下&#xff0c;加州野火烧毁了超过160…

揭示CTGAN的潜力:利用生成AI进行合成数据

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 我们都知道&#xff0c;GAN在生成非结构化合成数据&#xff08;如图像和文本&#xff09;方面越来越受欢迎。然而&#xff0c;在使用GAN生成合成表格数据方面所做的工作很少。合成数据具有许多好处&#x…

Ae 效果:CC Spotlight

透视/CC Spotlight Perspective/CC Spotlight CC Spotlight&#xff08;CC 聚光灯&#xff09; 主要用途是创建和控制逼真的聚光灯效果。通过调整这些属性&#xff0c;可以模拟出各种不同的照明环境和效果&#xff0c;比如舞台照明、日出日落、特定的颜色照明等。 ◆ ◆ ◆ 效…

儿童台灯什么光源好?如何挑选儿童护眼台灯

很多家长有时候会说孩子觉得家里的台灯灯光刺眼&#xff0c;看书看久了就不舒服。这不仅要看光线亮度是否柔和&#xff0c;还要考虑台灯是不是有做遮光式设计。没有遮光式设计的台灯&#xff0c;光源外露&#xff0c;灯光会直射孩子头部&#xff0c;孩子视线较低&#xff0c;很…

c语言——字符串函数和内存操作函数

深度学习字符串函数和内存操作函数 一、求字符串长度函数&#xff08;strlen&#xff09;二、长度不受限制的字符串函数2.1字符串拷贝函数&#xff08;strcpy&#xff09;2.2字符串连接函数&#xff08;strcat&#xff09;2.3字符串比较函数&#xff08;strcmp&#xff09; 三、…