QObject 訊號與槽原理

2021-08-21 17:48:54 字數 1102 閱讀 4610

只有繼承了qobject類的類,才具有訊號槽的能力。所以,為了使用訊號槽,必須繼承qobject。凡是qobject類(不管是直接子類還是間接子類),都應該在第一行**寫上q_object。不管是不是使用訊號槽,都應該新增這個巨集。這個巨集的展開將為我們的類提供訊號槽機制、國際化機制以及 qt 提供的不基於 c++ rtti 的反射能力。因此,如果你覺得你的類不需要使用訊號槽,就不新增這個巨集,就是錯誤的。其它很多操作都會依賴於這個巨集。注意,這個巨集將由 moc(我們會在後面章節中介紹 moc。這裡你可以將其理解為一種預處理器,是比 c++ 預處理器更早執行的預處理器。) 做特殊處理,不僅僅是巨集展開這麼簡單。moc 會讀取標記了 q_object 的標頭檔案,生成以 moc_ 為字首的檔案,比如 news*****.h 將生成 moc_news*****.cpp。你可以到構建目錄檢視這個檔案,看看到底增加了什麼內容。注意,由於 moc 只處理標頭檔案中的標記了q_object的類宣告,不會處理 cpp 檔案中的類似宣告。因此,如果我們的news*****和reader類位於 main.cpp 中,是無法得到 moc 的處理的。解決方法是,我們手動呼叫 moc 工具處理 main.cpp,並且將 main.cpp 中的#include "news*****.h"改為#include "moc_news*****.h"就可以了。不過,這是相當繁瑣的步驟,為了避免這樣修改,我們還是將其放在標頭檔案中。許多初學者會遇到莫名其妙的錯誤,一加上q_object就出錯,很大一部分是因為沒有注意到這個巨集應該放在標頭檔案中。

訊號就是乙個個的函式名,返回值是 void(因為無法獲得訊號的返回值,所以也就無需返回任何值),引數是該類需要讓外界知道的資料。訊號作為函式名,不需要在 cpp 函式中新增任何實現(我們曾經說過,qt 程式能夠使用普通的 make 進行編譯。沒有實現的函式名怎麼會通過編譯?原因還是在 moc,moc 會幫我們實現訊號函式所需要的函式體,所以說,moc 並不是單純的將 q_object 展開,而是做了很多額外的操作)。

qt 5 中,任何成員函式、static 函式、全域性函式和 lambda 表示式都可以作為槽函式。與訊號函式不同,槽函式必須自己完成實現**。槽函式就是普通的成員函式,因此作為成員函式,也會受到 public、private 等訪問控制符的影響。

自定義訊號槽需要注意的事項:

qt學習之路2筆記

qt 槽與訊號

槽就是乙個可以被呼叫處理特定訊號的函式 乙個小的qt類如下 class foo public qobject public slots void setvalue int signals void valuechanged int private int val qt中的元物件系統是用來處理物件間通...

QT訊號與槽

初學qt,覺得理解qt訊號與槽比較重要,qt很多時候都需要用到訊號和槽。發射訊號會觸發相對應的槽函式的執行。乙個訊號可以對應多個槽,多個訊號可以對應乙個槽。訊號和槽是通過connect這個方法進行建立聯絡的。qt中有些類會自帶有一些訊號和槽函式,當然訊號和槽函式也可以自己定義。下面來看下很簡單的 會...

Qt訊號與槽

訊號的定義必須在signals 保留字下,並且不需要實現 槽的定義必須在slots 保留字下,需要實現 訊號和槽通過qobject connect函式連線 當訊號被觸發時,槽函式被呼叫 需要注意的是 訊號和槽是qt的拓展,所以實現訊號和槽的類,必須是qobject的子類 實現訊號和槽的類,必須以巨集...