建材網(wǎng)站制作黑馬培訓(xùn)是正規(guī)學(xué)校嗎
一. 簡介
就我個人來理解,信號槽機制與Windows下消息機制類似,消息機制是基于回調(diào)函數(shù),Qt中用信號與槽來代替函數(shù)指針,使程序更安全簡潔。
信號和槽機制是 Qt 的核心機制,可以讓編程人員將互不相關(guān)的對象綁定在一起,實現(xiàn)對象之間的通信。
信號
當(dāng)對象改變其狀態(tài)時,信號就由該對象發(fā)射 (emit) 出去,而且對象只負(fù)責(zé)發(fā)送信號,它不知道另一端是誰在接收這個信號。這樣就做到了真正的信息封裝,能確保對象被當(dāng)作一個真正的軟件組件來使用。
槽
用于接收信號,而且槽只是普通的對象成員函數(shù)。一個槽并不知道是否有任何信號與自己相連接。而且對象并不了解具體的通信機制。
信號與槽的連接
所有從 QObject 或其子類 ( 例如 Qwidget ) 派生的類都能夠包含信號和槽。因為信號與槽的連接是通過 QObject 的 connect() 成員函數(shù)來實現(xiàn)的。
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
其中 sender 與 receiver 是指向?qū)ο蟮闹羔?#xff0c;SIGNAL() 與 SLOT() 是轉(zhuǎn)換信號與槽的宏。
二. 特點
一個信號可以連接多個槽
當(dāng)信號發(fā)射時,會以不確定的順序一個接一個的調(diào)用各個槽。
多個信號可以連接同一個槽
即無論是哪一個信號被發(fā)射,都會調(diào)用這個槽。
信號直接可以相互連接
發(fā)射第一個信號時,也會發(fā)射第二個信號。
連接可以被移除
這種情況用得比較少,因為在對象被刪除時,Qt會自動移除與這個對象相關(guān)的所有連接。語法如下:
disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
三. 應(yīng)注意的問題
信號與槽機制與普通函數(shù)的調(diào)用一樣,如果使用不當(dāng)?shù)脑?#xff0c;在程序執(zhí)行時也有可能產(chǎn)生死循環(huán)。因此,在定義槽函數(shù)時一定要注意避免間接形成無限循環(huán),即在槽中再次發(fā)射所接收到的同樣信號。例如 , 在前面給出的例子中如果在 mySlot() 槽函數(shù)中加上語句 emit mySignal() 即可形成死循環(huán)。
如果一個信號與多個槽相聯(lián)系的話,那么,當(dāng)這個信號被發(fā)射時,與之相關(guān)的槽被激活的順序?qū)⑹请S機的。
宏定義不能用在 signal 和 slot 的參數(shù)中。
信號和槽的參數(shù)個數(shù)與類型必須一致。
四. 程序舉例
這個demo程序由一個Label和PushButton組成,第一個例子中點擊按鈕,可以讓label關(guān)閉,這是最簡單的信號與槽的連接;第二例子中點擊按鈕,在label上獲取當(dāng)前系統(tǒng)時間,這個涉及到的知識點有:信號與槽的參數(shù)類型不同時如何連接、自定義槽函數(shù)、自定義信號。首先,新建一個Qt GUI程序,父窗口選為QDialog,類名為getTime,在頭文件和CPP文件分別加入如下代碼(小生愚鈍,還沒弄清楚博客園MarkDown代碼塊怎么高亮,所以只好貼截圖了,見諒)