版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014695839/article/details/83650431
当我们需要自定义事件时,可以先创建一个类继承QEvent:
//customevent.h
#include <QEvent>
class CustomEvent: public QEvent
{
public:
CustomEvent(int value1, double value2);
static Type eventType;
//可以定义一些成员或者函数来进行参数传递
int getValue1();
double getValue2();
private:
int _value1;
double _value2;
};
每个事件都需要有一个事件类型,而在QEvent::Type的枚举值中,User(1000)到MaxUser(65535)之间的值可被用于自定义的事件。因此,我们还要使用QEvent::registerEventType函数对自定义的事件进行注册,同时用这个注册过的值来初始化我们自定义的事件的类。
//customevent.cpp
QEvent::Type CustomEvent::eventType = (QEvent::Type)QEvent::registerEventType(QEvent::User+1);
CustomEvent::CustomEvent(int value1, double value2)
: QEvent(Type(eventType)), _value1(value1), _value2(value2)
{
}
int CustomEvent::getValue1() { return _value1; }
double CustomEvent::getValue2() { return _value2; }
事件使用以下两个函数发送,具体区别可按F1查询
bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority)
事件接收者通过重写QObject的event函数或者customEvent函数对自定义事件进行处理
#include <QObject>
#include <QDebug>
class Receiver: public QObject
{
Q_OBJECT
public:
Receiver();
protected:
void customEvent(QEvent* event);
{
QEvent::Type eventType = event->type();
if((eventType == CustomEvent::eventType))
{
/*在这里处理事件*/
CutomEvent customEvent = dynamic_cast<CustomEvent *>(event);
qDebug() << customEvent.getValue1();
qDebug() << customEvent.getValue2();
event->accept();
}
}
bool event(QEvent* event)
{
QEvent::Type eventType = event->type();
if((eventType == CustomEvent::eventType))
{
/*在这里处理事件*/
CutomEvent customEvent = dynamic_cast<CustomEvent *>(event);
qDebug() << customEvent.getValue1();
qDebug() << customEvent.getValue2();
}
return QObject::event(event);
}
//重写的以上两个函数都可以处理自定义事件,可以二选一
};
例子:
Receiver receiver;
//发送事件方法1
QApplication::sendEvent(receiver, &CustomEvent(1, 2.3));
//发送事件方法2
QApplication::postEvent(receiver, new CustomEvent(1, 2.3));