爲什麼要添加包括在CPP的Qt源代碼.moc文件很重要?爲什麼包括一個Qt源代碼文件的末尾「.moc」文件很重要?
這是用於多個Qt樣本的常用步驟,包括這一個: http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html;其中#include「testqstring.moc」行應該包含在文件的末尾。
我不明白exactaly這是爲什麼neccessary。
感謝。
爲什麼要添加包括在CPP的Qt源代碼.moc文件很重要?爲什麼包括一個Qt源代碼文件的末尾「.moc」文件很重要?
這是用於多個Qt樣本的常用步驟,包括這一個: http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html;其中#include「testqstring.moc」行應該包含在文件的末尾。
我不明白exactaly這是爲什麼neccessary。
感謝。
如果在.cpp
文件中使用Q_OBJECT
宏定義QObject
子類,則必須這樣做。當你這樣做的:
qmake
必須生成您Makefile
內部規則,對.cpp
文件調用moc
。
那特(hackish的?)列入觸發qmake
這樣做,並在您.cpp
調用時告訴它這將是moc
的輸出文件(teststring.moc
)。
爲了編譯moc
的輸出(仍然是一堆C++代碼),編譯器必須看到你的類定義。否則,它會抱怨說,有沒有這樣的事情作爲YourClass::staticMetaObject
和類似的,因爲它不知道YourClass
存在。
通常一個限定類設有在頭文件Q_OBJECT
。 moc
然後添加#include "header.h"
成其產生的輸出,並且這意味着moc
的輸出可以愉快地編譯。
但是如果你的班級定義在.cpp
以內呢?你不能#include
一個.cpp
文件moc
的輸出,因爲這將讓你重新定義噸的錯誤。
相反,你#include
moc
的輸出在.cpp
,所以它被編譯在一起,大家都高興。 (這意味着qmake
只會發出一個規則說跑moc
,而不是另一個規則告訴編譯器來編譯moc
的輸出。)
從2.你也可以還desume是限定與Q_OBJECT
類一個.h
不需要任何特殊的內容。
爲什麼在http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html確實Qt文檔;在cpp中包含moc文件? –
正如我所說,有一個類定義爲特色,以CPP一個'Q_OBJECT'。 – peppe
你並不需要做的,如果你在一個單獨的頭文件中聲明你的'Q_OBJECT'類。否則,它會缺少所有使QObject成爲'QObject'的附加功能。 – Zeta