Почему важно включать & quot; .moc & quot; файл в конце файла с исходным кодом Qt?

Почему важно добавить файл включения для .moc в исходный код Qt cpp?

Это общий шаг, используемый в нескольких примерах Qt, включая этот:
http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html; где строка #include «testqstring.moc» должна быть включена в конец файла.

Я не понимаю точно, почему это необходимо.

Благодарю.

8

Решение

Это необходимо, если вы определите QObject подклассы с Q_OBJECT макрос в .cpp файл. Когда вы делаете это:

  1. qmake должны генерировать правила внутри вашего Makefile вызывать moc на что .cpp файл.

    Это специальные (хакерские?) Триггеры включения qmake сделать это, и говорит, что будет mocвыходной файл (teststring.moc) когда вызывается на ваш .cpp,

  2. Для того, чтобы скомпилировать 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 не требует какого-либо специального включения.

18

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]