2

次のようなファイルがあります。

#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」には、「Engine」という名前空間にある「Area」というクラスがあります(実際には、「Engine::World::」という 2 つのネストされた名前空間にあります)。何らかの形で QMake を混乱させています!

#include を削除してコメントアウトすると、すべてが正常にコンパイルされます (ただし、「Area」を事前に宣言する必要があり、それをクラス内のポインターまたは参照としてのみ使用できます)。

だから私は #include を「MOC_SKIP_BEGIN」にラップしようとしました.QMakeがそのヘッダーをスキップすることを期待して、オンラインへの一見古風な参照を見つけることができます. いいえ、まだコンパイルに失敗します。

インクルードしたいヘッダーをインクルードしながら、これをコンパイルする方法はありますか?

4

1 に答える 1

3

ドキュメントから:

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 によってスキップされます。

于 2013-09-07T19:29:20.810 に答える