首先看一個簡單的用到信號與槽的程序。
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton *button = new QPushButton("Quit");
QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
button->show();
return app.exec();
}
關於此程序的幾點解析:
1、關於頭文件
和普通的C++程序沒有什麼兩樣,如果要使用某個組件,就必須要引入相應的頭文件,這類似於Java的import機制。值得說明的是,Qt中頭文件和類名是一致的。也就是說,如果你要使用某個類的話,它的類名就是它的頭文件名。
2、創建對象
創建一個QApplication對象。這個對象用於管理應用程序級別的資源。QApplication的構造函數要求兩個參數,分別來自main的那兩個參數,因此,Qt在一定程度上是支持命令行參數的。
創建一個QPushButton 對象,並且能夠顯示字符串。和其他庫的控件一樣,這是用來接受用戶動作並可以顯示文本的。在Qt中,這被稱為一個widget,它等同於Windows技術裡面的控件(controls)和容器(containers)。也就是說,widget可以放置其他的widget,就像Swing的組件。大多數Qt程序使用QMainWindow或者QDialog作為頂級組件,但Qt並不強制要求這點。
提醒:在一個Qt源代碼中,一下兩條語句是必不可少的:
QApplication app(argc, argv);
//...
return app.exec();
Then,開始正文,signal和slot
QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
這句話通過connect()語句實現了信號和槽的連接。其應該是如下樣子:
connect( sender, SIGNAL(signal), receiver, SLOT(slot) );
這裡的sender和receiver是指向QObject的指針,signal和slot是不帶參數的函數名。
關於信號和槽的機制:當一個特定的事件發生時,一個或幾個被指定的信號就被發射(emit),槽就是一個返回值為void的函數,如果存在一個或幾個槽和該信號相連接,那在該信號被發射後,這個(些)槽(函數)就會立刻被執行。
通俗的講信號是用戶的動作,對應的槽就是程序的相應的響應動作。
而上個程序中的語句就相當於button被用戶按(clicked)了一下,然後button就向周圍的組件發出吶喊:我被擊中了。。。
然後周圍的組件一般都不會理他,除非有個和他關系(connect)的,而至於和他有關系的要做什麼,沒有直接要求,而是直接讓他執行了一個函數quit,就這樣,通過組件與函數就完成信號與槽的簡單機制。
然後,關於信號和槽的聯系接收:
上面的示例是單個信號和槽的連接,而其實也可以
把幾個信號連接在同一個槽上,這樣任何一個信號被發射都會使得該槽被執行;
把一個信號和多個槽連接在一起,這樣該信號一旦被發射,與之相連接的槽都會馬上執行,但執行的順序不確定,也不可以指定;把一個信號和另一個信號進行連接,這樣,只要第一個信號被發射,第二個信號立刻 就被發射。
還可以移除連接disconnect。(但是很少用,因為在刪除對象的時候,Qt會自動取消與之相關的所有連接)
信號和槽的機制是類型安全的:一個信號的簽名必須與它的接收槽的簽名相匹配。(實際上一個槽的簽名可以比它接收的信號的簽名少,因為它可以忽略額外的簽名。)所謂的簽名就是指他們的參數(類型與數量)
OK,暫時領會的就這麼多。。。
Ubuntu 環境下Gtk與QT編譯環境安裝與配置 http://www.linuxidc.com/Linux/2013-08/88539.htm
Linux系統下QT環境搭建 http://www.linuxidc.com/Linux/2013-07/87576.htm
Ubuntu下QT控制台程序無法運行的解決方案以及XTerm的配置方法 http://www.linuxidc.com/Linux/2013-06/86244.htm
Ubuntu 10.04下QT4.7.4移植詳解 http://www.linuxidc.com/Linux/2013-01/77930.htm
Ubuntu 14.04下安裝部署Qt5開發環境 http://www.linuxidc.com/Linux/2014-05/101774.htm
Qt 的詳細介紹:請點這裡
Qt 的下載地址:請點這裡