【原创】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

posted @ 2016-04-12 21:04  xiaoleisme  阅读(355)  评论(0编辑  收藏  举报