QT中的信號槽

只有繼承了QObject類的類,才具備信號槽的能力。因此,爲了使用信號槽,必須繼承QObject函數

凡是QObject類(無論是直接子類仍是間接子類),都應該在第一行代碼寫上Q_OBJECT。 無論是否是使用信號槽,都應該添加這個宏。工具

這個宏的展開將爲咱們的類提供信號槽機制、國際化機制以及 Qt 提供的不基於 C++ RTTI 的反射能力。所以,若是你以爲你的類不須要使用信號槽,就不添加這個宏,就是錯誤的。其它不少操做都會依賴於這個宏。學習

這個宏將由 moc作特殊處理,不單單是宏展開這麼簡單。moc 會讀取標記了 Q_OBJECT 的頭文件,生成以 moc_ 爲前綴的文件,好比 newspaper.h 將生成 moc_newspaper.cpp。你能夠到構建目錄查看這個文件,看看到底增長了什麼內容。spa

注意,因爲 moc 只處理頭文件中的標記了Q_OBJECT的類聲明,不會處理 cpp 文件中的相似聲明。所以,若是咱們的NewspaperReader類位於 main.cpp 中,是沒法獲得 moc 的處理的。解決方法是,咱們手動調用 moc 工具處理 main.cpp,而且將 main.cpp 中的#include "newspaper.h"改成#include "moc_newspaper.h"就能夠了。不過,這是至關繁瑣的步驟,爲了不這樣修改,咱們仍是將其放在頭文件中。許多初學者會遇到莫名其妙的錯誤,一加上Q_OBJECT就出錯,很大一部分是由於沒有注意到這個宏應該放在頭文件中。code

  • 發送者和接收者都須要是QObject的子類(固然,槽函數是全局函數、Lambda 表達式等無需接收者的時候除外);
  • 使用 signals 標記信號函數,信號是一個函數聲明,返回 void,不須要實現函數代碼;
  • 槽函數是普通的成員函數,做爲成員函數,會受到 public、private、protected 的影響;
  • 使用 emit 在恰當的位置發送信號;
  • 使用QObject::connect()函數鏈接信號和槽。

【Qt 學習之路 2(5):自定義信號槽】繼承

相關文章
相關標籤/搜索