【原创】QT多线程和自定事件自我总结
最近又搞上了QT,还是恶心的QT3(因为公司规定要QT3)。因为项目用到了多线程,子线程要向主界面线程传值。用到了多线程和自定事件。现总结如下:
一、编写自定义的事件类
先看代码:
#include <qevent.h> class MyEvent : public QCustomEvent { public: MyEvent( int type,QString result1): QCustomEvent( type ) { result=result1; }; QString get_result() const { return result; }; private: QString result; };
相关说明:
1、自定义的事件从QCustomEvent继承。
2、QCustomEvent类在QT4已被Qevent替代,只能在QT3中使用!!!!
3、如果你没有携带自己的数据的话,直接使用QcustomEvent类就可以了!!
二、事件发送
先看代码:
while(1) { sleep(5); QString display=QString("Test Qstring!!"); MyEvent *aa=new MyEvent(event_type1,display); QApplication::postEvent(targetWidget,aa); }
相关说明:
1、简化实例,只在一个线程中定时发送,线程可通过继续Qthread类,并重写run()来实现.
2、创建自定义事件时,首先需要有一个事件号,为了避免与Qt系统定义的事件类型冲突(在Qt中,系统将保留0 - 999的值),该id值应该大于枚举类型QEvent::Type中给出的"User"值。其中,QEvent::User值是1000,QEvent::MaxUser的值是65535。从这里知道,你最多可以定义64536个事件,相信这个数字已经足够大了!上面的event_type1定义如下:
enum { event_type1 = 1001, event_type2 = 1002};
3、可通过QApplication::postEvent()发送事件!
三、事件接收
先看代码:
void test::customEvent(QCustomEvent *event) { if ((int)event->type() == event_type1) { MyEvent* ce = (MyEvent*)event; QMessageBox::about(this, tr("About"), tr(ce->get_result()) ); } }
1、如果要处理自定义事件,可以重写QObject的customEvent()函数,该函数接收一个QCustomEvent对象作为参数。
2、通过event->type()来判断类型,从而区分处理
例子下载:
http://download.csdn.net/detail/beisika10368/3699392
(有QT3和QT4二个版本)
-------- 2011-10-19