Qt图形界面编程入门(信号和槽通信机制)
信號和槽機制是Qt的核心機制,可以讓編程人員將互不相關的對象綁定在一起,實現(xiàn)對象之間的通信。
聲明了信號的對象,當其狀態(tài)改變時,信號就由該對象發(fā)送出去,而且該對象只負責發(fā)送信號,它不知道另一端是誰在接收這個信號。
槽用于接收和處理信號,一個槽并不知道是否有任何信號與自己相連接。
槽實際上只是普通的對象成員函數(shù)。當一個信號被發(fā)射時,與其相關的槽將被立即執(zhí)行,就像一個正常的函數(shù)調(diào)用一樣。
信號與槽機制完全獨立于任何GUI事件循環(huán)。
信號
①信號(signal)的聲明是在一個類的頭文件中進行的
②Qt的signal關鍵字指出進入了信號聲明區(qū),隨后即可聲明自己的信號
例如:
signals:void stateChanged(int nNewVal); //定義信號這里signals是Qt的關鍵字,而非C++的關鍵字。
信號函數(shù)stateChanged定義了信號stateChanged,這個信號帶有參數(shù)nNewVal
信號函數(shù)語法受到以下幾點約束:
①函數(shù)返回值是void類型,因為觸發(fā)信號函數(shù)的目的是執(zhí)行與其綁定的槽函數(shù),無須信號函數(shù)返回任何值。
②開發(fā)人員只能聲明而不能實現(xiàn)信號函數(shù)。
③信號函數(shù)被moc自動設置為protected,因而只有包含一個信號函數(shù)的那個類及其派生類才能使用該信號函數(shù)。
④信號函數(shù)的參數(shù)個數(shù)、類型由開發(fā)人員自行設定。這些參數(shù)的職責是封裝類的狀態(tài)信息,并將這些信息傳遞給槽函數(shù)。
⑤只有QObject及其派生類才可以聲明信號函數(shù)
槽
①槽函數(shù)和普通的C++成員函數(shù)一樣,可以被正常調(diào)用。
②槽唯一的特殊性就是很多信息可以與其相關聯(lián)。
③當與其關聯(lián)的信號被發(fā)送時,這個槽就會被調(diào)用。
④槽可以有參數(shù),但槽的參數(shù)不能有默認值。關鍵字slots表名進入了槽函數(shù)聲明區(qū)。
槽的聲明也是在頭文件中進行的,例如:
public slots: //此語句說明后面就是槽函數(shù)void Function(int nNewVal){qDebug() << "new Values" << nNewVal; //顯示變量 }槽函數(shù)的返回值是void類型,因為信號和槽機制是單向的:信號被發(fā)送后,與其綁定的槽函數(shù)會被執(zhí)行,但不要求槽函數(shù)返回任何執(zhí)行結(jié)果。和信號函數(shù)一樣,只有QObject及其派生類才可以定義槽函數(shù)。
既然槽函數(shù)是普通的成員函數(shù),因此與其他的函數(shù)一樣,它們也有存取權(quán)限(public,protected,private)。也就是說,人們能控制其他類能夠以怎樣的方式調(diào)用一個函數(shù)。
關聯(lián)信號與槽
通過調(diào)用QObject::connect函數(shù)可以綁定一個信號函數(shù)和一個槽函數(shù),該函數(shù)最常用的格式如下:
connect(sender,SIGNAL(signal_func()),receiver,SLOT(slot_func()))其中sender及receiver都是指向QObject(或其子類)對象的指針
前者指向發(fā)送信號的對象,后者指向處理信號的對象,兩者分別被稱為“發(fā)送者”及“接收者”。
signal_func以及slot_func分別是這兩個對象中定義的信號函數(shù)和槽函數(shù)。
當指定信號signal時一般使用Qt的宏SIGNAL,指定槽函數(shù)時必須使用宏SLOT。
一個信號函數(shù)可以和多個槽函數(shù)綁定。
多個信號函數(shù)可以和一個槽函數(shù)綁定。
使用信號和槽機制時應該注意以下幾點:
①信號和槽機制與普通函數(shù)調(diào)用一樣,如果使用不當,在程序執(zhí)行時也有可能產(chǎn)生死循環(huán)
②如果一個信號與多個槽相聯(lián)系,那么當這個信號被發(fā)送時,與之相關的槽被激活的順序?qū)⑹请S機的
③宏定義不能用在信號和槽的參數(shù)中。
④信號和槽的參數(shù)個數(shù)與類型必須一致
信號和槽舉例
?
再次建立頭文件
exampleA.h,修改其內(nèi)容為
#ifndef EXAMPLEA_H #define EXAMPLEA_H #include<QCoreApplication> class CExampleA:public QObject {Q_OBJECTint m_Value;// 定義私有成員 public:CExampleA(){m_Value = 0;}void SetValue(int nNewVal){if (m_Value == nNewVal){ return ; }m_Value = nNewVal;// emit函數(shù)用來激活信號函數(shù),發(fā)送信號emit stateChanged(m_Value);} signals: // 定義信號函數(shù),帶參數(shù)void stateChanged(int nNewVal); }; #endif // EXAMPLEA_H?exampleB.h,修改其內(nèi)容為
#ifndef EXAMPLEB_H #define EXAMPLEB_H #include<QDebug> //包含調(diào)式類 #include<QCoreApplication> class CExampleB:public QObject {Q_OBJECT public:CExampleB(){} public slots: //定義槽函數(shù)void Function(int nNewVal) //nNewVal為100{qDebug() << "new Values" << nNewVal;} };#endif // EXAMPLEB_H?再次打開新建對話框,添加主函數(shù)文件
?
main.cpp中修改為
?
#include<exampleA.h> #include<exampleB.h> int main() {CExampleA a; //創(chuàng)建CExampleA類的對象a,調(diào)用構(gòu)造函數(shù),m_Value = 0CExampleB b; //創(chuàng)建CExampleB類的對象b//連接信號和槽,connect函數(shù)要求發(fā)送對象和接收對象均為指針,a,b是對象名,&a,&b是發(fā)送對象的指針和接收對象的指針。QObject::connect(&a,SIGNAL(stateChanged(int)),&b,SLOT(Function(int)));a.SetValue(100); //調(diào)用a對象的公有函數(shù)return 0; }運行
簡單實現(xiàn)了信號與槽的功能
總結(jié)
以上是生活随笔為你收集整理的Qt图形界面编程入门(信号和槽通信机制)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哈哈机器人送到冰雪小镇_从小镇到上海:两
- 下一篇: level-2是什么意思