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的訊息。至於訊號槽的原理我覺得
可以在學會實現訊號槽程式碼後,抽空慢慢體會。先有實踐,再理解原