У меня есть файл, который выглядит так:
#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 пропустит этот заголовок. Нет, по-прежнему не компилируется.
Есть ли способ, которым я могу скомпилировать это, сохраняя при этом возможность включать заголовок, который я хочу включить?