歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Qt 初探信號與槽(signal & slot)

Qt 初探信號與槽(signal & slot)

日期:2017/3/1 9:41:52   编辑:Linux編程

首先看一個簡單的用到信號與槽的程序。

#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 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved