Почему важно добавить файл включения для .moc в исходный код Qt cpp?
Это общий шаг, используемый в нескольких примерах Qt, включая этот:
http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html; где строка #include «testqstring.moc» должна быть включена в конец файла.
Я не понимаю точно, почему это необходимо.
Благодарю.
Это необходимо, если вы определите QObject
подклассы с Q_OBJECT
макрос в .cpp
файл. Когда вы делаете это:
qmake
должны генерировать правила внутри вашего Makefile
вызывать moc
на что .cpp
файл.
Это специальные (хакерские?) Триггеры включения qmake
сделать это, и говорит, что будет moc
выходной файл (teststring.moc
) когда вызывается на ваш .cpp
,
Для того, чтобы скомпилировать moc
В результате (который все еще представляет собой набор кода C ++) компилятор должен увидеть определение вашего класса. В противном случае, он будет жаловаться, что нет такой вещи, как YourClass::staticMetaObject
и тому подобное, потому что он понятия не имеет, что YourClass
существует.
Обычно каждый определяет классы, показывающие Q_OBJECT
в заголовочном файле. moc
затем добавляет #include "header.h"
в его сгенерированный вывод, а это значит moc
Выходные данные могут быть успешно скомпилированы.
Но что, если ваше определение класса находится внутри .cpp
? Ты не можешь #include
.cpp
файл в moc
вывод, так как это даст вам массу ошибок переопределения.
Вместо этого вы #include
moc
выходной в вашем .cpp
, так что это скомпилировано вместе, и все счастливы. (Это означает qmake
будет испускать только одно правило, говорящее, чтобы бежать moc
, но не другое правило, указывающее компилятору компилировать moc
выходной.)
Из 2. вы также можете предположить, что определение классов с Q_OBJECT
в .h
не требует какого-либо специального включения.
Других решений пока нет …