看過了簡單的Hello, world! 以後,下面來看看Qt最引覺得豪的信號槽機制!
所謂信號槽,簡單來講,就像是插銷同樣:一個插頭和一個插座。怎麼說呢?當某種事件發生以後,好比,點擊了一下鼠標,或者按了某個按鍵,這時,這個組件就會發出一個信號。就像是廣播同樣,若是有了事件,它就漫天發聲。這時,若是有一個槽,正好對應上這個信號,那麼,這個槽的函數就會執行,也就是回調。就像廣播發出了,若是你感興趣,那麼你就會對這個廣播有反應。乾巴巴的解釋很無力,仍是看代碼:
![](http://static.javashuo.com/static/loading.gif)
#include <QtGui/QApplication>
![](http://static.javashuo.com/static/loading.gif)
#include <QtGui/QPushButton>
int main(
int argc,
char *argv[])
![](http://static.javashuo.com/static/loading.gif)
{
![](http://static.javashuo.com/static/loading.gif)
QApplication a(argc, argv);
![](http://static.javashuo.com/static/loading.gif)
QPushButton *button =
new QPushButton(
"Quit");
![](http://static.javashuo.com/static/loading.gif)
QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
![](http://static.javashuo.com/static/loading.gif)
button->show();
return a.exec();
![](http://static.javashuo.com/static/loading.gif)
}
這是在Qt Creator上面新建的文件,由於前面已經詳細的說明怎麼新建工程,因此這裏就再也不贅述了。這個程序很簡單,只有一個按鈕,點擊以後程序退出。(順便說一句,Qt裏面的button被叫作QPushButton,真搞不明白爲何一個簡單的button非得加上push呢?呵呵)
主要是看這一句:
![](http://static.javashuo.com/static/loading.gif)
QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
QObject是全部類的根。Qt使用這個QObject實現了一個單根繼承的C++。它裏面有一個connect靜態函數,用於鏈接信號槽。
當一個按鈕被點擊時,它會發出一個clicked信號,意思是,向周圍的組件們聲明:我被點擊啦!固然,其它不少組件都懶得理他。若是對它感興趣,就告訴QObject說,你幫我盯着點,只要button發出clicked信號,你就告訴我——想了想以後,說,算了,你也別告訴我了,直接去執行個人某某某函數吧!就這樣,一個信號槽就造成了。具體來講呢,這個例子就是QApplication的實例a說,若是button發出了clicked信號,你就去執行個人quit函數。因此,當咱們點擊button的時候,a的quit函數被調用,程序退出了。因此,在這裏,clicked()就是一個信號,而quit()就是槽,形象地說就是把這個信號插進這個槽裏面去。
Qt使用信號槽機制完成了事件監聽操做。這相似與Swing裏面的listener機制,只是要比這個listener簡單得多。之後咱們會看到,這種信號槽的定義也異常的簡單。值得注意的是,這個信號槽機制僅僅是使用的QObject的connect函數,其餘並無什麼耦合——也就是說,徹底能夠利用這種機制實現你本身的信號監聽!不過,這就須要使用qmake預處理一下了!
細心的你或許發現,在Qt Creator裏面,SIGNAL和SLOT居然變顏色了!沒錯,Qt確實把它們當成了關鍵字!實際上,Qt正是利用它們擴展了C++語言,所以才須要使用qmake進行預處理,比便使普通的C++編譯器可以順利編譯。另外,這裏的signal和Unix系統裏面的signal沒有任何的關係!哦哦,有一點關係,那就是名字是同樣的!
信號槽機制是Qt關鍵部分之一,之後咱們還會再仔細的探討這個問題的。