2008年12月22日 星期一

event

Qt的事件跟Signal、Slot機制是不同的。
Signal與Slot的機制是同步的(Synchronous),Signal是由物件發出的,使用QObject的connect()連接物件上定義的Slot來立即處理。
Qt的事件可以是非同步的(Asynchronous)的,Qt使用一個事件佇列來維護,新的事件產生時基本上會被排到佇列的尾端,前一個事件處理完成,再從佇列的前端取出下一個佇列來處理,必要的時候,Qt的事件也可以是同步的,而事件還可以使用「事件過濾器」進行過濾處理。

跟網路要傳封包感覺很像,先學起來~

在qt3的教學文件中有一個部分範例
建立一個自定的事件

class ColorChangeEvent : public QCustomEvent
{
  public:
    ColorChangeEvent( QColor color ) : QCustomEvent( 346798 ), c( color ) {};
    QColor color() const { return c; };
  private:
    QColor c;
};


// To send an event of this custom event type:產生一個事件,並傳送給receiver

ColorChangeEvent* ce = new ColorChangeEvent( blue );
QApplication::postEvent( receiver, ce ); // Qt will delete it when done


// To receive an event of this custom event type:接收事件

void MyWidget::customEvent( QCustomEvent * e )
{
  if ( e->type() == 346798 ) { // It must be a ColorChangeEvent
    ColorChangeEvent* ce = (ColorChangeEvent*)e;
    newColor = ce->color();
  }
}


下面是我自己寫的一個例子
myevent.h

#ifndef MYEVENT_H
#define MYEVENT_H

#include <qevent.h>

class MyEvent:public QCustomEvent
{
  public:
    MyEvent(int );

    int value() const;
  private:
    int x;
};

#endif // MYEVENT_H


myevent.cpp

#include "myevent.h"

MyEvent::MyEvent(int y):QCustomEvent(346798),x(y){
  // do nothing
}

int MyEvent::value() const{
  return x;
}


mywidget.h

#ifndef MYWIDGET_H
#define WYWIDGET_H

#include <qwidget.h>
#include "myevent.h"

class MyWidget:public QWidget
{
  public:
    MyWidget(QWidget *parent,const char *name=0);

  protected:
    void customEvent(QCustomEvent *);

};

#endif // MYWIDGET_H


mywidget.cpp

#include "mywidget.h"

#include <iostream>
using namespace std;

MyWidget::MyWidget(QWidget *parent,const char *name):QWidget(parent,name)
{
  // do nothing
}

void MyWidget::customEvent(QCustomEvent *e){
  if (e->type() == 346798) {
    MyEvent *ce = (MyEvent *) e; // 透過父類別的子標變數接收,要強制轉換成子類別的子標
    cout << "有接收到事件啦" << ce->value() << endl;
  }
}


main.cpp

#include <qapplication.h>

#include "mywidget.h"

int main(int argc,char **argv)
{
  QApplication app(argc,argv);

  MyWidget w(0);

  MyEvent *m = new MyEvent(22);
  QApplication::postEvent(&w,m);

  w.resize(300,300);

  app.setMainWidget(&w);
  w.show();

  return app.exec();
}


C++事件(Event)機制的實現一例

沒有留言: