继承QEvent
// 实现在myevent.h中
#include <QEvent>
class MyEvent: public QEvent
{
public:
MyEvent(int value1, double value2)
: QEvent(Type(eventType)), _value1(value1), _value2(value2) {}
// 定义自定义事件类型
static QEvent::Type eventType;
// 可以定义一些成员或者函数来进行参数传递
int getValue1() { return _value1; }
double getValue2() { return _value2; }
private:
int _value1;
double _value2;
};
定义事件类型
每个事件都需要有一个事件类型,而在QEvent::Type
的枚举值中,User(1000)到MaxUser(65535)之间的值可被用于自定义的事件。
另外,需要使用QEvent::registerEventType
函数对自定义的事件进行注册,同时用这个注册过的值来初始化我们自定义的事件的类。
// 实现在myevent.cpp中
QEvent::Type MyEvent::eventType = (QEvent::Type)QEvent::registerEventType(QEvent::User+1);
实现接收者
接收者必须继承自QObject,事件循环的基础。
class MyReceiver: public QObject
{
Q_OBJECT
public:
MyReceiver() {}
protected:
void dealMyEvent(QEvent* event) {
MyEvent *myEvent = dynamic_cast<MyEvent*>(event);
qDebug() << "getValue1: "<<myEvent->getValue1();
qDebug() << "getValue2: "<<myEvent->getValue2();
}
void customEvent(QEvent* event) {
QEvent::Type eventType = event->type();
if(eventType == MyEvent::eventType) {
// 在这里处理事件
dealMyEvent(event);
event->accept();
}
}
bool event(QEvent* event) {
QEvent::Type eventType = event->type();
if(eventType == MyEvent::eventType) {
// 在这里处理事件
dealMyEvent(event);
}
return QObject::event(event);
}
};
发送事件消息
需要先建立QApplication实例。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyReceiver receiver;
// 发送事件方法1
qDebug()<<"start sendEvent...";
QApplication::sendEvent(static_cast<QObject*>(&receiver), &MyEvent(1, 2.3));
// 发送事件方法2
qDebug()<<"start postEvent...";
QApplication::postEvent(static_cast<QObject*>(&receiver), new MyEvent(10, 20.3));
return a.exec(); // 进入消息循环
}
网友评论