起先還擔心QT從linux來,事件模型不一樣,玩了以后發(fā)現完全多余, 熟悉swing或c#的事件處理就一點問題都沒有。

和Swing的事件處理機制的一點點差別是,QT不使用對象注冊那種方式,而是使用聲明綁定的方式,更加靈活一些。
基本格式如下:

QObject::connect(sender, SIGNAL(signal), receiver, SLOT(slot));

SIGNAL表示對象的觸發(fā)事件, SLOT表示相應的處理函數。 此處使用的是類似函數指針的做法,和c#很相似.相比java的inner class要簡單干凈一些。

這種做法還有個比較巧妙的地方,可以形成sender和receiver之間的自動關聯,不用寫多余代碼。
比如下面的代碼, 當spinbox的值發(fā)生變化時,自動把值設置給 slider。

QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                     slider, SLOT(setValue(int)));
 
還有一種玩法, 把一個Signal綁定給另外一個signal,這樣一個事件觸發(fā)以后,另外一個對象的指定事件也會被觸發(fā)

connect(lineEdit, SIGNAL(textChanged(const QString &)),   this, SIGNAL(updateRecord(const QString &)));


也可以移除SIGNAL和SLOT之間的綁定關系

disconnect(lcd, SIGNAL(overflow()),  this, SLOT(handleMathError()));


如果使用QT的designer,則還有一種玩法,使用名稱約定的方式進行綁定。
比如
private slots:
     void on_addButton_clicked();

這就綁定了 addButton的clicked事件。


其他: SIGNAL和SLOT的參數數目和類型必須一致,如果SIGNAL的參數多過SLOT則多余的會被忽視。