MOC добавляет пространство имен к именам классов

У меня очень странная проблема при компиляции проекта. MOC, кажется, добавляет пространство имен к имени класса, который переносится, хотя это нигде не упоминается в файле / классе.

Пространство имен, однако, существует в библиотеке, которую я использую, но оно скрыто далеко в заголовочных файлах, и я не использую его в файлах пользовательского интерфейса. Вот что генерирует MOC:

const QMetaObject SmpTl::CaptureController::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_SmpTl__CaptureController,
  qt_meta_data_SmpTl__CaptureController, 0 }};

SmpTl пространство имен не упоминается нигде в объявлении CaptureController, но он появляется в сгенерированном MOC файле.cpp.

Я использую Visual Studio с интеграцией QT.

2 ответа

Решение

SmpTl это пространство имен CaptureController определяется в том, как он был найден MOC.

Q_OBJECT макрос расширяется в декларации staticMetaObject- переменная внутри определения вашего класса (помимо прочего, она расширяется). MOC-файл содержит определение этой переменной.

Если это не правильно, пожалуйста, опубликуйте свою версию Qt и урезанную версию вашего заголовочного файла.

Я тоже столкнулся с этой проблемой. У меня был код, который выглядел так:

namespace foo {
    #ifdef _WIN32
    ...   // This code was fine
    #else
    #error Not Supported
    #endif
}

Это запутало MOC в думающем пространстве имен foo никогда не закрывается. Видимо, не знал _WIN32 был определен и сбит с толку тем фактом, что я забыл поставить кавычки вокруг сообщения об ошибке. Меняя это на:

#error "Not Supported"

исправил мою проблему.

Другие вопросы по тегам