我们有时候想发送自定义事件
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 :

本文介绍了Qt中自定义事件的创建、注册、发送和处理方法。创建自定义事件需继承QEvent,事件类型在QEvent::User和QEvent::MaxUser之间,可使用sendEvent()和postEvent()发送。注册有两种方法,发送分异步和阻塞。处理可重写customEvent或使用eventFilter,同时指出post局部变量会出错。
3280

被折叠的 条评论
为什么被折叠?



