只有繼承了QObject
類的類,才具備信號槽的能力。因此,爲了使用信號槽,必須繼承QObject
。函數
凡是QObject
類(無論是直接子類仍是間接子類),都應該在第一行代碼寫上Q_OBJECT
。 無論是否是使用信號槽,都應該添加這個宏。工具
這個宏的展開將爲咱們的類提供信號槽機制、國際化機制以及 Qt 提供的不基於 C++ RTTI 的反射能力。所以,若是你以爲你的類不須要使用信號槽,就不添加這個宏,就是錯誤的。其它不少操做都會依賴於這個宏。學習
這個宏將由 moc作特殊處理,不單單是宏展開這麼簡單。moc 會讀取標記了 Q_OBJECT 的頭文件,生成以 moc_ 爲前綴的文件,好比 newspaper.h 將生成 moc_newspaper.cpp。你能夠到構建目錄查看這個文件,看看到底增長了什麼內容。spa
注意,因爲 moc 只處理頭文件中的標記了Q_OBJECT
的類聲明,不會處理 cpp 文件中的相似聲明。所以,若是咱們的Newspaper
和Reader
類位於 main.cpp 中,是沒法獲得 moc 的處理的。解決方法是,咱們手動調用 moc 工具處理 main.cpp,而且將 main.cpp 中的#include "newspaper.h"
改成#include "moc_newspaper.h"
就能夠了。不過,這是至關繁瑣的步驟,爲了不這樣修改,咱們仍是將其放在頭文件中。許多初學者會遇到莫名其妙的錯誤,一加上Q_OBJECT
就出錯,很大一部分是由於沒有注意到這個宏應該放在頭文件中。code
QObject
的子類(固然,槽函數是全局函數、Lambda 表達式等無需接收者的時候除外);QObject::connect()
函數鏈接信號和槽。【Qt 學習之路 2(5):自定義信號槽】繼承