QT中的信號和槽函數

一 信號和槽機制
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");};

具體的使用方法,參考百度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章