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)機制的實現一例
沒有留言:
張貼留言