繼承QEvent
// 實現(xiàn)在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;
// 可以定義一些成員或者函數(shù)來進行參數(shù)傳遞
int getValue1() { return _value1; }
double getValue2() { return _value2; }
private:
int _value1;
double _value2;
};
定義事件類型
每個事件都需要有一個事件類型哟冬,而在QEvent::Type
的枚舉值中近迁,User(1000)到MaxUser(65535)之間的值可被用于自定義的事件。
另外旅急,需要使用QEvent::registerEventType
函數(shù)對自定義的事件進行注冊,同時用這個注冊過的值來初始化我們自定義的事件的類鸟顺。
// 實現(xiàn)在myevent.cpp中
QEvent::Type MyEvent::eventType = (QEvent::Type)QEvent::registerEventType(QEvent::User+1);
實現(xiàn)接收者
接收者必須繼承自QObject酷宵,事件循環(huán)的基礎亥贸。
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);
}
};
發(fā)送事件消息
需要先建立QApplication實例。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyReceiver receiver;
// 發(fā)送事件方法1
qDebug()<<"start sendEvent...";
QApplication::sendEvent(static_cast<QObject*>(&receiver), &MyEvent(1, 2.3));
// 發(fā)送事件方法2
qDebug()<<"start postEvent...";
QApplication::postEvent(static_cast<QObject*>(&receiver), new MyEvent(10, 20.3));
return a.exec(); // 進入消息循環(huán)
}