起先還擔(dān)心QT從linux來(lái),事件模型不一樣,玩了以后發(fā)現(xiàn)完全多余, 熟悉swing或c#的事件處理就一點(diǎn)問(wèn)題都沒(méi)有。

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

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

SIGNAL表示對(duì)象的觸發(fā)事件, SLOT表示相應(yīng)的處理函數(shù)。 此處使用的是類(lèi)似函數(shù)指針的做法,和c#很相似.相比java的inner class要簡(jiǎn)單干凈一些。

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

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

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


也可以移除SIGNAL和SLOT之間的綁定關(guān)系

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


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

這就綁定了 addButton的clicked事件。


其他: SIGNAL和SLOT的參數(shù)數(shù)目和類(lèi)型必須一致,如果SIGNAL的參數(shù)多過(guò)SLOT則多余的會(huì)被忽視。