看過了簡(jiǎn)單的 Hello, world! 之后,下面來看看 Qt 最引以為豪的信號(hào)槽機(jī)制!
所謂信號(hào)槽,簡(jiǎn)單來說,就像是插銷一樣:一個(gè)插頭和一個(gè)插座。怎么說呢?當(dāng)某種事件發(fā)生之后,比如,點(diǎn)擊了一下鼠標(biāo),或者按了某個(gè)按鍵,這時(shí),這個(gè)組件就會(huì)發(fā)出一個(gè)信號(hào)。就像是廣播一樣,如果有了事件,它就漫天發(fā)聲。這時(shí),如果有一個(gè)槽,正好對(duì)應(yīng)上這個(gè)信號(hào),那么,這個(gè)槽的函數(shù)就會(huì)執(zhí)行,也就是回調(diào)。就像廣播發(fā)出了,如果你感興趣,那么你就會(huì)對(duì)這個(gè)廣播有反應(yīng)。干巴巴的解釋很無(wú)力,還是看代碼:
#include <QtGui/QApplication>
#include <QtGui/QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton *button = new QPushButton("Quit");
QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
button->show();
return a.exec();
}
這是在 Qt Creator 上面新建的文件,因?yàn)榍懊嬉呀?jīng)詳細(xì)的說明怎么新建工程,所以這里就不再贅述了。這個(gè)程序很簡(jiǎn)單,只有一個(gè)按鈕,點(diǎn)擊之后程序退出。(順便說一句,Qt 里面的 button 被叫做QPushButton,真搞不明白為什么一個(gè)簡(jiǎn)單的 button 非得加上 push 呢?呵呵)
主要是看這一句:
QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
QObject 是所有類的根。Qt 使用這個(gè) QObject 實(shí)現(xiàn)了一個(gè)單根繼承的 C++。它里面有一個(gè) connect靜態(tài)函數(shù),用于連接信號(hào)槽。
當(dāng)一個(gè)按鈕被點(diǎn)擊時(shí),它會(huì)發(fā)出一個(gè) clicked 信號(hào),意思是,向周圍的組件們聲明:我被點(diǎn)擊啦!當(dāng)然,其它很多組件都懶得理他。如果對(duì)它感興趣,就告訴 QObject 說,你幫我盯著點(diǎn),只要 button 發(fā)出 clicked 信號(hào),你就告訴我——想了想之后,說,算了,你也別告訴我了,直接去執(zhí)行我的某某某函數(shù)吧!就這樣,一個(gè)信號(hào)槽就形成了。具體來說呢,這個(gè)例子就是 QApplication 的實(shí)例 a 說,如果button 發(fā)出了 clicked 信號(hào),你就去執(zhí)行我的 quit 函數(shù)。所以,當(dāng)我們點(diǎn)擊 button 的時(shí)候,a的 quit 函數(shù)被調(diào)用,程序退出了。所以,在這里,clicked()就是一個(gè)信號(hào),而 quit()就是槽,形象地說就是把這個(gè)信號(hào)插進(jìn)這個(gè)槽里面去。
Qt 使用信號(hào)槽機(jī)制完成了事件監(jiān)聽操作。這類似與 Swing 里面的 listener 機(jī)制,只是要比這個(gè)listener 簡(jiǎn)單得多。以后我們會(huì)看到,這種信號(hào)槽的定義也異常的簡(jiǎn)單。值得注意的是,這個(gè)信號(hào)槽機(jī)制僅僅是使用的 QObject 的 connect 函數(shù),其他并沒有什么耦合——也就是說,完全可以利用這種機(jī)制實(shí)現(xiàn)你自己的信號(hào)監(jiān)聽!不過,這就需要使用 qmake 預(yù)處理一下了!
細(xì)心的你或許發(fā)現(xiàn),在 Qt Creator 里面,SIGNAL 和 SLOT 竟然變顏色了!沒錯(cuò),Qt 確實(shí)把它們當(dāng)成了關(guān)鍵字!實(shí)際上,Qt 正是利用它們擴(kuò)展了 C++ 語(yǔ)言,因此才需要使用 qmake 進(jìn)行預(yù)處理,比便使普通的 C++ 編譯器能夠順利編譯。另外,這里的 signal 和 Unix 系統(tǒng)里面的 signal 沒有任何的關(guān)系!哦哦,有一點(diǎn)關(guān)系,那就是名字是一樣的!
信號(hào)槽機(jī)制是 Qt 關(guān)鍵部分之一,以后我們還會(huì)再仔細(xì)的探討這個(gè)問題的。
本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031
更多建議: