就我我的來理解,信號槽機制與Windows下消息機制相似,消息機制是基於回調函數,Qt中用信號與槽來代替函數指針,使程序更安全簡潔。編程
信號和槽機制是 Qt 的核心機制,可讓編程人員將互不相關的對象綁定在一塊兒,實現對象之間的通訊。安全
信號函數
當對象改變其狀態時,信號就由該對象發射 (emit) 出去,並且對象只負責發送信號,它不知道另外一端是誰在接收這個信號。這樣就作到了真正的信息封裝,能確保對象被看成一個真正的軟件組件來使用。指針
槽code
用於接收信號,並且槽只是普通的對象成員函數。一個槽並不知道是否有任何信號與本身相鏈接。並且對象並不瞭解具體的通訊機制。對象
信號與槽的鏈接blog
全部從 QObject 或其子類 ( 例如 Qwidget ) 派生的類都可以包含信號和槽。由於信號與槽的鏈接是經過 QObject 的 connect() 成員函數來實現的。get
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
其中 sender 與 receiver 是指向對象的指針,SIGNAL() 與 SLOT() 是轉換信號與槽的宏。回調函數
一個信號能夠鏈接多個槽博客
當信號發射時,會以不肯定的順序一個接一個的調用各個槽。
多個信號能夠鏈接同一個槽
即不管是哪個信號被髮射,都會調用這個槽。
信號直接能夠相互鏈接
發射第一個信號時,也會發射第二個信號。
鏈接能夠被移除
這種狀況用得比較少,由於在對象被刪除時,Qt會自動移除與這個對象相關的全部鏈接。語法以下:
disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
這個demo程序由一個Label和PushButton組成,第一個例子中點擊按鈕,可讓label關閉,這是最簡單的信號與槽的鏈接;第二例子中點擊按鈕,在label上獲取當前系統時間,這個涉及到的知識點有:信號與槽的參數類型不一樣時如何鏈接、自定義槽函數、自定義信號。
首先,新建一個Qt GUI程序,父窗口選爲QDialog,類名爲getTime,在頭文件和CPP文件分別加入以下代碼(小生愚鈍,還沒弄清楚博客園MarkDown代碼塊怎麼高亮,因此只好貼截圖了,見諒)
頭文件
實現文件
保存、編譯、運行以後點擊按鈕便可看到label消失了。
而後在頭文件中加入自定義的槽函數和信號,並在CPP文件中實現槽函數,具體以下:
頭文件
實現文件
而後保存,編譯運行便可,點擊按鈕後就能看到label上顯示當前時間了。