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.hqwc.cn/news/58418.html

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

相关文章

一零六七、JVM梳理

JVM&#xff1f; Java虚拟机&#xff0c;可以理解为Java程序的运行环境&#xff0c;可以执行Java字节码&#xff08;Java bytecode&#xff09;并提供了内存管理、垃圾回收、线程管理等功能 java内存区域划分?每块内存中都对应什么? 方法区&#xff1a;类的结构信息、常量池、…

享元模式(C++)

定义 运用共享技术有效地支持大量细粒度的对象。 使用场景 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中&#xff0c;从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时&#xff0c;让外部客户程序仍…

【C++】多态的底层原理(虚函数表)

文章目录 前言一、虚函数表二、派生类中虚函数表1.原理2.例子&#xff1a; 三、虚函数的存放位置四 、单继承中的虚函数表五、多继承中的虚函数表六、问答题 前言 一、虚函数表 通过观察测试我们发现b对象是8bytes&#xff0c;除了_b成员&#xff0c;还多一个__vfptr放在对象的…

常量池-JVM(十九)

上篇文章说gc日志以及arthas。 Arthas & GC日志-JVM&#xff08;十八&#xff09; 一、常量池 常量池主要放两大类&#xff1a;字面量和符号引用。 字面量就是由字母、数字等构成的字符串或者数值常量。 符号引用主要包含三类常量。 类和接口的全限定名。字段的名称和…

wm8960没有声音

最近在imx6ull上调试这个声卡&#xff0c;用官方的镜像是能发声的&#xff0c;换到自己做的镜像上&#xff0c;就没有声音。 记录一下过程&#xff1a; 内核和设备树。只要有下面的显示&#xff0c;就说明加载成功。 再看一下aplay的显示 到此&#xff0c;驱动都是正常的。但…

Jmeter组件作用域及执行顺序

目录 一、Jmeter八大可执行元件 二、组件执行顺序 三、组件作用域 四、特殊说明 一、Jmeter八大可执行元件 配置元件---Config Element 用于初始化默认值和变量&#xff0c;以便后续采样器使用。配置元件大其作用域的初始阶段处理&#xff0c;配置元件仅对其所在的测试树分…

SpringMVC的架构有什么优势?——控制器(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

设计模式行为型——观察者模式

目录 什么是观察者模式 观察者模式的实现 观察者模式角色 观察者模式类图 观察者模式举例 观察者模式代码实现 观察者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式…

hive修改表或者删除表时卡死问题的解决(2023-08-08)

背景&#xff1a;前阶段在做hive表的改表名时&#xff0c;总是超时&#xff0c;表是内部表&#xff0c;数据量特别大&#xff0c;无论你是修改表名还是删除表都是卡死的状态&#xff0c;怎么破&#xff1f; 终于&#xff1a;尝试出来一个新的方法 将内部表转化成外部表&#…

GD32F103硬件I2C0通讯

GD32F103的I2C模块有I2C0和I2C1;本程序使用I2C0功能模块; I2C0引脚复用和重映射: 当I2C0_REMAP0时,I2C0引脚复用功能,I2C0_SCL映射到PB6引脚,I2C0_SDA映射到PB7引脚; 当I2C0_REMAP1时,I2C0引脚重映射,I2C0_SCL映射到PB8引脚,I2C0_SDA映射到PB9引脚; I2C1引脚只有复用引脚: I2C…

Docker极速安装Jenkins

安装 Jenkins 是一个常见的任务&#xff0c;使用 Docker 进行安装可以简化该过程并确保环境一致性。以下是在 Docker 中安装 Jenkins 的详细步骤&#xff1a; 安装 Docker: 首先&#xff0c;请确保您已在目标机器上安装了 Docker。根据您的操作系统&#xff0c;可以在 Docker 官…

Oracle10g静默安装(已解决无法初始化数据库)

oracle10201对最小化安装Linux不是很友好&#xff0c;也可能因为太老所以没有在对其进行优化&#xff0c;导致其只支持静默安装不支持静默dbca初始化数据库正常使用&#xff08;必须带有GUI桌面&#xff09;&#xff0c;虽然现有技术有很多方法可以解决但还是有些繁琐&#xff…