一 信號和槽機制
1 概念
信號和槽是Qt中自行定義的一種通信機制,實現對象之間的交互,當某個對象發生改變時將會發送信號,該信號可以被其它對象接收,接收以後將執行一個指定的成員函數(槽函數).
圖解:
2 定義
1)包含信號或槽的類必須是QObject的子類
2)信號使用“signals:”標記,信號函數只需聲明,不能寫定義
3)槽使用“public slots:”標記,槽函數可以和某個信號建立連接,通過某個信號觸發槽函數的執行;另外槽函數也可以當做是普通的成員函數,直接調用
4)包含信號或槽的類,前面需要添加宏"Q_OBJECT",將來構建工程時,會調用moc(元對象編譯器)將語法擴展的信號或槽還原爲標準C++代碼.
代碼的實現格式:
class XX:public QObject{
Q_OBJECT //moc
signals:
void sigFunc(void);//信號函數
public slots:
void slotFunc(void){...}//槽函數
};
3 信號和槽連接
QObject::connect(
const QObject* sender, //信號發送對象,可以是QObject所有子類類型
const char* signal, //信號函數
const QObject* receiver, //信號接收對象,可以是QObject所有子類類型
const char* method); //槽函數
注:
SIGNAL(信號函數(參數表)) //將信號函數轉換爲const char*
SLOT(槽函數(參數表)) //將槽函數轉換爲const char*
案例:創建一個Qt應用程序,裏面包含一個標籤和一個按鈕,實現點擊按鈕關閉標籤。
4 信號和槽連接的語法要求
1)信號和槽參數要一致
QObject::connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int)));//ok
QObject::connect(A,SIGNAL(sigFunc(void)),B,SLOT(slotFunc(int)));//error
Qt老版本中槽函數的實現:
connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int)));
Qt新版本中槽函數的實現:
connect(A,Signal1,B,Slot1);
老版本槽函數函數的特點:優點 參數 很直觀 缺點 不做類型檢測 所以不推薦使用
2)可以帶有缺省參數
class B{
Q_OBJECT
public slots:
void slotFunc(int i=0){}
};
QObject::connect(A,SIGNAL(sigFunc(void)),B,SLOT(slotFunc(void)));//ok
3)信號函數的參數可以比槽函數參數多,多餘參數將被忽略 相反則不可以
QObject::connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(void)));//ok
4)一個信號可以同時連接多個槽函數(一對多)
QObject::connect(A,SIGNAL(sigFunc(int)),B1,SLOT(slotFunc1(int)));//ok
QObject::connect(A,SIGNAL(sigFunc(int)),B2,SLOT(slotFunc2(int)));//ok
注:如果A對象發送喜好,B1和B2的槽函數都會被執行
5)多個信號可以同時連接到同一個槽函數(多對一)
QObject::connect(A1,SIGNAL(sigFunc1(int)),B,SLOT(slotFunc(int)));//ok
QObject::connect(A2,SIGNAL(sigFunc2(int)),B,SLOT(slotFunc(int)));//ok
注:無論A1或A2發送信號,B的槽函數都會被執行
6)兩個信號函數可以直接連接(信號串聯)//瞭解
QObject::connect(A1,SIGNAL(sigFunc1(int)),A2,SIGNAL(sigFunc2(int)));//ok
注:當A1發送信號時,所連接的A2對象的信號也將被髮送.
在應用槽函數的很多時候也用到了lambda表達式;
Lambda表達式:用於定義並創建匿名的函數對象。
Lambda的語法形式如下:
[函數對象參數] (操作符重載函數參數) mutable 或exception聲明 ->返回值類型 {函數體}
[]是lambda表達式,選擇傳遞的方式
[](){Btn->settext("aaaa");};
1,值傳遞
[=](){Btn->settext("aaaa");};
2,址 傳遞
[&](){Btn->settext("aaaa");};
具體的使用方法,參考百度。