Qt 初探信號(hào)槽

2018-10-04 10:02 更新

初探信號(hào)槽

看過(guò)了簡(jiǎn)單的 Hello, world! 之后,下面來(lái)看看 Qt 最引以為豪的信號(hào)槽機(jī)制!

所謂信號(hào)槽,簡(jiǎn)單來(lái)說(shuō),就像是插銷一樣:一個(gè)插頭和一個(gè)插座。怎么說(shuō)呢?當(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ì)的說(shuō)明怎么新建工程,所以這里就不再贅述了。這個(gè)程序很簡(jiǎn)單,只有一個(gè)按鈕,點(diǎn)擊之后程序退出。(順便說(shuō)一句,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 說(shuō),你幫我盯著點(diǎn),只要 button 發(fā)出 clicked 信號(hào),你就告訴我——想了想之后,說(shuō),算了,你也別告訴我了,直接去執(zhí)行我的某某某函數(shù)吧!就這樣,一個(gè)信號(hào)槽就形成了。具體來(lái)說(shuō)呢,這個(gè)例子就是 QApplication 的實(shí)例 a 說(shuō),如果button 發(fā)出了 clicked 信號(hào),你就去執(zhí)行我的 quit 函數(shù)。所以,當(dāng)我們點(diǎn)擊 button 的時(shí)候,a的 quit 函數(shù)被調(diào)用,程序退出了。所以,在這里,clicked()就是一個(gè)信號(hào),而 quit()就是槽,形象地說(shuō)就是把這個(gè)信號(hào)插進(jìn)這個(gè)槽里面去。

Qt 使用信號(hào)槽機(jī)制完成了事件監(jiān)聽(tīng)操作。這類似與 Swing 里面的 listener 機(jī)制,只是要比這個(gè)listener 簡(jiǎn)單得多。以后我們會(huì)看到,這種信號(hào)槽的定義也異常的簡(jiǎn)單。值得注意的是,這個(gè)信號(hào)槽機(jī)制僅僅是使用的 QObject 的 connect 函數(shù),其他并沒(méi)有什么耦合——也就是說(shuō),完全可以利用這種機(jī)制實(shí)現(xiàn)你自己的信號(hào)監(jiān)聽(tīng)!不過(guò),這就需要使用 qmake 預(yù)處理一下了!

細(xì)心的你或許發(fā)現(xiàn),在 Qt Creator 里面,SIGNAL 和 SLOT 竟然變顏色了!沒(méi)錯(cuò),Qt 確實(shí)把它們當(dāng)成了關(guān)鍵字!實(shí)際上,Qt 正是利用它們擴(kuò)展了 C++ 語(yǔ)言,因此才需要使用 qmake 進(jìn)行預(yù)處理,比便使普通的 C++ 編譯器能夠順利編譯。另外,這里的 signal 和 Unix 系統(tǒng)里面的 signal 沒(méi)有任何的關(guān)系!哦哦,有一點(diǎn)關(guān)系,那就是名字是一樣的!

信號(hào)槽機(jī)制是 Qt 關(guān)鍵部分之一,以后我們還會(huì)再仔細(xì)的探討這個(gè)問(wèn)題的。

本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)