1. 继承QEvent类,不用定义Q_OBJECT宏,
注意QEvent的构造函数有个枚举类型的QEvent::Type参数,表明事件类型,
对于自定义类型,这个枚举值应该在1000~65535之间,
推荐使用int QEvent::registerEventType()静态方法获取一个系统分配的事件类型,
该函数返回值会在1000~65535之间。
2. 调用静态方法QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
receiver为事件接收者,event为自定义事件对象,priority优先级一般采用默认值即可
调用postEvent的线程和receiver可以在同一个线程中,也可以在不同的线程中
举例:QCoreApplication::postEvent(&mainWindow,new MyEvent());
不用担心MyEvent的释放问题,在接收线程中会帮忙释放该对象,
可以在MyEvent的析构函数中打断点跟踪自定义事件是如何被释放的。
3. 重载事件接受者的event方法
根据事件类型,判断如果是自定义的事件,就处理并返回true,
否则,调用父类的event方法并返回。
举例:
1. 创建Qt Widgets Application
2. 自定义事件
#include <QEvent>
class MyEvent : public QEvent
{
public:
MyEvent(int data);
~MyEvent();
int data() {return _data;}
private:
int _data;
};
MyEvent::MyEvent(int data) : QEvent(QEvent::Type(1001))
{
_data = data;
}
3. 创建线程,在线程中发送事件
#include<QThread>
#include <QWidget>
class MyThread : public QThread
{
public:
MyThread(QWidget *main_window);
protected:
void run();
private:
QWidget* _pmw; //事件接收者
};
#include <QCoreApplication>
MyThread::MyThread(QWidget *main_window)
{
_pmw = main_window;
}
void MyThread::run()
{
while(_pmw)
{
sleep(3);
QCoreApplication::postEvent(_pmw,new MyEvent(2));
}
}
4. 重载接受者MainWindow的event方法
bool MainWindow::event(QEvent *event)
{
if(event->type() == 1001)
{
MyEvent* e = static_cast<MyEvent*>(event);
//处理自定义事件
return true;
}
return QMainWindow::event(event);
}
5. main函数中:
#include "myevent.h"
#include "mythread.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
//a.postEvent(&w,new MyEvent(3)); 本线程发送自定义事件
MyThread t(&w); //新线程中发送自定义事件
t.start();
return a.exec();
}