2016-01-21 35 views
3

爲什麼要添加包括在CPP的Qt源代碼.moc文件很重要?爲什麼包括一個Qt源代碼文件的末尾「.moc」文件很重要?

這是用於多個Qt樣本的常用步驟,包括這一個: http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html;其中#include「testqstring.moc」行應該包含在文件的末尾。

我不明白exactaly這是爲什麼neccessary。

感謝。

+2

你並不需要做的,如果你在一個單獨的頭文件中聲明你的'Q_OBJECT'類。否則,它會缺少所有使QObject成爲'QObject'的附加功能。 – Zeta

回答

12

如果在.cpp文件中使用Q_OBJECT宏定義QObject子類,則必須這樣做。當你這樣做的:

  1. qmake必須生成您Makefile內部規則,對.cpp文件調用moc

    那特(hackish的?)列入觸發qmake這樣做,並在您.cpp調用時告訴它這將是moc的輸出文件(teststring.moc)。

  2. 爲了編譯moc的輸出(仍然是一堆C++代碼),編譯器必須看到你的類定義。否則,它會抱怨說,有沒有這樣的事情作爲YourClass::staticMetaObject和類似的,因爲它不知道YourClass存在。

    通常一個限定類設有在頭文件Q_OBJECTmoc然後添加#include "header.h"成其產生的輸出,並且這意味着moc的輸出可以愉快地編譯。

    但是如果你的班級定義在.cpp以內呢?你不能#include一個.cpp文件moc的輸出,因爲這將讓你重新定義噸的錯誤。

    相反,你#includemoc的輸出在.cpp,所以它被編譯在一起,大家都高興。 (這意味着qmake只會發出一個規則說跑moc,而不是另一個規則告訴編譯器來編譯moc的輸出。)

從2.你也可以還desume是限定與Q_OBJECT類一個.h不需要任何特殊的內容。

+0

爲什麼在http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html確實Qt文檔;在cpp中包含moc文件? –

+3

正如我所說,有一個類定義爲特色,以CPP一個'Q_OBJECT'。 – peppe