我有一个看起来像的文件:
#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'中,然后导致编译失败。
以下是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: ;
}
}
}
以下是应该的内容:
void AreaEditor::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
头文件“Engine / World / Area.h”有一个名为'Area'的类,它位于命名空间'Engine'中(实际上,它位于'Engine :: World ::',两个嵌套的命名空间中)。似乎这在某种程度上让QMake感到困惑!
如果我删除#include,将其注释掉,一切都编译好(除非我必须预先声明'Area',然后才能将它用作类中的指针或引用)。
所以我尝试将#include包装在一个“MOC_SKIP_BEGIN”中,我可以找到看似古老的在线引用,希望QMake会跳过那个标题。不,仍然无法编译。
有没有办法让我可以编译它,同时仍然可以包含我想要包含的标题?
答案 0 :(得分:2)
来自文档:
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跳过了。