QMake moc 文件被名称空间混淆

Jam*_*rey 2 qt qmake moc qt5

我有一个如下所示的文件:

#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
Run Code Online (Sandbox Code Playgroud)

然而,当Qt生成_moc文件时,它错误地认为“AreaEditor”位于“Engine”命名空间中,从而导致编译失败。

以下是 QMake 生成的 moc 文件的示例片段:

      ______/---------<-< 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: ;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它应该是这样的:

void AreaEditor::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
Run Code Online (Sandbox Code Playgroud)

头文件“Engine/World/Area.h”有一个名为“Area”的类,位于“Engine”命名空间中(实际上,它位于“Engine::World::”中,两个嵌套的命名空间)。看起来像这样在某种程度上让 QMake 感到困惑!

如果我删除 #include 并将其注释掉,一切都会编译正常(除了我必须预先声明“Area”,然后只能将其用作类中的指针或引用)。

所以我尝试将 #include 包装在“MOC_SKIP_BEGIN”中,我可以在网上找到看似过时的参考,希望 QMake 会跳过该标头。不行,还是编译失败。

有没有办法让我编译它,同时仍然能够包含我想要包含的标头?

lpa*_*app 5

从文档中:

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

您可以明确告诉 moc 不要解析头文件的部分内容。moc 定义预处理器符号 Q_MOC_RUN。任何被包围的代码

#ifndef Q_MOC_RUN
...
#endif
Run Code Online (Sandbox Code Playgroud)

被 moc 跳过。