2007-07-29

Qt Programming - Callback function與signal/Slot

Event-Driven的設計:

在許多的傳統的UI設計中,經常會有所謂Callback function的設計,例如這個按鈕按下去(event)之後
需要做什麼事,是你事先並無法確定或是缺乏一些資訊來進行時,我們就必須利用Callback function先將
function pointer註冊在這個按鈕中,等到他被按下後,便執行此function。所以這個function會被稱
之為Callback function,因為是註冊後才會被呼叫。

但是,有X11/Xt 經驗的設計師就會明白Callback function的缺點有下:
  1. 缺乏function signature的檢查:Callback function是以function pointer的方式註冊,所以compiler是無法在compile的時候幫你做檢查,通常是程式在執行時才會發生錯誤。

Qt的Signal/Slot設計:


Qt的Signal/Slot機制使得programmer可以更快找出這類問題,並縮短程式開發的時間(大部分的
Programmer認為找出Bug在哪裡的時間遠大於修正他的時間)。

Qt利用moc這個類似preprocessor的程式將程式碼中的signal和slot編成可以編譯的meta object檔。
使programmer在寫程式時減少參數傳錯的機會。例如,

connect( this, SIGNAL( myButtonClicked( int, char) ),
this, SLOT( doSomething( int, char ) ) );
上面的例子中,myButtonClicked和doSomething的function signature必須完全吻合。而他們的宣
告應該如下:

class MyClass : public QObject {

Q_OBJECT

public:
/* ... */
signals:
void myButtonClicked(int, char);

public slots:
void doSomething(int, char);

private:
/* ... */

};
甚至,使用者可以在一些特定的情況下,自己發出signal,如

// 如果按鈕被按時,
emit myButtonClicked(3, 'c'); //
而在接收端,就會執行

void
MyClass::doSomething( int k, char c)
{
// k = 3, c = 'c';
}
是不是很簡單呢?

沒有留言:

張貼留言