Qt 的訊號與槽(純乾貨)

       接觸Qt斷斷續續有些時間了,總看了一堆的文章說訊號槽的概念,心裡就想罵人,做為一個初學者,最重要的就是怎麼寫程式碼,寫程式碼寫多了,再去看理論,有時水到渠成的就明白那些理論了。但所有講訊號槽的都把一堆訊號槽的好處說一通,把MFC的消息機制貶一通。具體程式碼應該怎麼實現訊號槽輕飄飄的就忽略過去了。

       直接開始吧!

       訊號槽是為了實現兩個對象之間的通訊機制,說白了就是比如一個按鈕對象點擊了一下想告訴主介面並讓主介面回應這個按鈕的點擊動作,怎麼辦呢?

       第一步程式碼建立連接:

       

      註:這是用程式碼建立訊號槽連接,還有一種方法在後續裡面補充。

      第二步程式碼實現槽函數:(註:這一步可有可無哦,為什麼?繼續往下看。)

      public slots:

          ……………….

     以上就是最簡單的訊號槽實現,下面繼續細說!

     1、茲要是從QObject繼承的類都可以有訊號槽

     2、第一步的連接函數一般放在構造函數里,這一點不是必需的

     3、SIGNAL是個宏,括弧里的訊號不同的對象有不同,可在Qt 助手裡查找,如想查找QPushButton類的對象有哪些訊號,可打開Qt助手,

           

   4、現在說說第二步為什麼可以沒有,如果接收訊號的槽是對象預定義的,那麼就沒有第二步的程式碼,直接將槽函數名寫的 SLOT的括弧里即可

   5、建立訊號槽可以用connect()函數,也可以在Qt設計師環境里用拖拽實現,如下

        註:因為我是用VS里安裝Qt插件的方式開發,所以打開Qt設計師的方法是雙擊 ***.ui 文件的方式。

       5.1 菜單 Edit -> 編輯訊號/槽

        

       5.2 進入 訊號槽編輯模式 後,用滑鼠左鍵按住發射訊號的對象,如QPushButton/QWidget 等,然後拖拽滑鼠移動到接收訊號的對象

             

            5.3 鬆開滑鼠會彈出一個窗口,在這個彈出的窗口裡選擇訊號和槽,即可

                  

   總結:訊號槽的實現方式我也就知道這兩種,相對於MFC過渡的人來說,connect()就象MFC的 BEGIN_MESSAGE_MAP宏里寫的程式碼,槽函數就象MFC里的響應函數,訊號就類似MFC的消息。至於訊號槽的原理我覺得

              可以在學會實現訊號槽程式碼後,抽空慢慢體會。先有實踐,再理解原理。