Qt 初探信號槽

2018-10-04 10:02 更新

初探信號槽

看過了簡單的 Hello, world! 之后,下面來看看 Qt 最引以為豪的信號槽機制!

所謂信號槽,簡單來說,就像是插銷一樣:一個插頭和一個插座。怎么說呢?當某種事件發(fā)生之后,比如,點擊了一下鼠標,或者按了某個按鍵,這時,這個組件就會發(fā)出一個信號。就像是廣播一樣,如果有了事件,它就漫天發(fā)聲。這時,如果有一個槽,正好對應上這個信號,那么,這個槽的函數(shù)就會執(zhí)行,也就是回調(diào)。就像廣播發(fā)出了,如果你感興趣,那么你就會對這個廣播有反應。干巴巴的解釋很無力,還是看代碼:

#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 上面新建的文件,因為前面已經(jīng)詳細的說明怎么新建工程,所以這里就不再贅述了。這個程序很簡單,只有一個按鈕,點擊之后程序退出。(順便說一句,Qt 里面的 button 被叫做QPushButton,真搞不明白為什么一個簡單的 button 非得加上 push 呢?呵呵)

主要是看這一句:

QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));

QObject 是所有類的根。Qt 使用這個 QObject 實現(xiàn)了一個單根繼承的 C++。它里面有一個 connect靜態(tài)函數(shù),用于連接信號槽。

當一個按鈕被點擊時,它會發(fā)出一個 clicked 信號,意思是,向周圍的組件們聲明:我被點擊啦!當然,其它很多組件都懶得理他。如果對它感興趣,就告訴 QObject 說,你幫我盯著點,只要 button 發(fā)出 clicked 信號,你就告訴我——想了想之后,說,算了,你也別告訴我了,直接去執(zhí)行我的某某某函數(shù)吧!就這樣,一個信號槽就形成了。具體來說呢,這個例子就是 QApplication 的實例 a 說,如果button 發(fā)出了 clicked 信號,你就去執(zhí)行我的 quit 函數(shù)。所以,當我們點擊 button 的時候,a的 quit 函數(shù)被調(diào)用,程序退出了。所以,在這里,clicked()就是一個信號,而 quit()就是槽,形象地說就是把這個信號插進這個槽里面去。

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

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

信號槽機制是 Qt 關鍵部分之一,以后我們還會再仔細的探討這個問題的。

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號