Файлы QMake moc запутаны пространствами имен

У меня есть файл, который выглядит так:

#ifndef ENGINE_PLATFORM_AREAEDITOR_H
#define ENGINE_PLATFORM_AREAEDITOR_H

#include <QWidget>
#include "../Widgets/QtSfmlWidget.h"

namespace Engine { namespace World { class Area; } }

//This tell's Qt's qmake to ignore the code between MOC_SKIP_BEGIN and MOC_SKIP_END
// MOC_SKIP_BEGIN
#include "Engine/World/Area.h"
// MOC_SKIP_END

namespace Ui {
class AreaEditor;
}

class AreaEditor : public QWidget
{
    Q_OBJECT

public:
    Engine::World::Area area;

public:
    explicit AreaEditor(QWidget *parent = 0);
    ~AreaEditor();

    //...stuff....

private slots:
    void on_markerTextEdit_textChanged();

    void onDrawAreaScreen(sf::RenderTarget &renderTarget);
    void onDrawAreaResized(const WindowSize &windowSize);

private:
    Ui::AreaEditor *ui;

    //...stuff....
};

#endif //ENGINE_PLATFORM_AREAEDITOR_H

Однако, когда Qt создает файл _moc, он ошибочно считает, что «AreaEditor» находится в пространстве имен «Engine», что приводит к сбою компиляции.

Вот пример фрагмента файла moc, который генерирует QMake:

      ______/---------<-< Wrong       
     V      V
void Engine::AreaEditor::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
    if (_c == QMetaObject::InvokeMetaMethod) {
        AreaEditor *_t = static_cast<AreaEditor *>(_o);
        switch (_id) {
        case 0: _t->on_markerTextEdit_textChanged(); break;
        case 1: _t->onDrawAreaScreen((*reinterpret_cast< sf::RenderTarget(*)>(_a[1]))); break;
        case 2: _t->onDrawAreaResized((*reinterpret_cast< const WindowSize(*)>(_a[1]))); break;
        default: ;
        }
    }
}

Вот что должно быть:

void AreaEditor::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)

В заголовочном файле «Engine/World/Area.h» есть класс с именем «Area», который находится в пространстве имен «Engine» (на самом деле он находится в «Engine::World::», два вложенных пространства имен). каким-то образом сбивает с толку QMake!

Если я удаляю #include, комментируя его, все компилируется нормально (за исключением того, что мне нужно предварительно объявить «Область», а затем я могу использовать ее только как указатель или ссылку в классе).

Поэтому я попытался обернуть #include в «MOC_SKIP_BEGIN», который я могу найти в Интернете, казалось бы, архаичными ссылками, надеясь, что QMake пропустит этот заголовок. Нет, по-прежнему не компилируется.

Есть ли способ, которым я могу скомпилировать это, сохраняя при этом возможность включать заголовок, который я хочу включить?


person Jamin Grey    schedule 05.09.2013    source источник


Ответы (1)


Из документации:

http://qt-project.org/doc/qt-5.0/qtdoc/moc.html#command-line-options

Вы можете явно указать moc не анализировать части файла заголовка. moc определяет символ препроцессора Q_MOC_RUN. Любой код, окруженный

#ifndef Q_MOC_RUN
...
#endif

пропускается moc.

person lpapp    schedule 07.09.2013