2017-11-22 3 views
0

structQWizardページ内に私のカスタムを使用しています。例えば、私はタイプnm::FooQ_PROPERTYregisterFieldにできるようにしたいヘッダファイルとソースファイルを使用するときにQ_DECLARE_METATYPE文を配置する場所は?

// foo.h 

namespace nm{ 

struct Foo 
{ 
    Foo(); 
    void bar(); 
}; 

} 

::さんはstruct(またはclass)そうのように言ってみましょう

// within some QWizardPage class 
Q_PROPERTY(nm::Foo foo READ getFoo WRITE setFoo) 

私が知っているために、私のためにその

Q_DECLARE_METATYPE(nm::Foo) 

しかし、私は正しくabovを配置する場所を把握することはできません。私はQtのメタタイプとしてそれを宣言する必要があり、それを使用しますeステートメント。また、ソースファイルを持ちながら、私は、ヘッダファイルの最後にそれを置く場合は、私が手

path/QtCore/qglobal.h:738: error: static assertion failed: Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system. #define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)

/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h:149: error: expected constructor, destructor, or type conversion before ‘typedef’ typedef PTRDIFF_TYPE ptrdiff_t;

私は Foo.cppの最後に置きますが、コンパイル・エラーを取得しようとしました

すべての定義をFoo.hに移動し、それをヘッダー専用ファイルとして使用すると、ファイルの最後(名前空間の外側)にステートメントを置くと動作します。しかし、私のクラス定義は長いものですが、クラス定義をソースファイルに配置したいのです。

Q_DECLARE_METATYPE私のクラスのヘッダーとソースファイルを持ち、ヘッダのみのファイルではありません。

EDIT(ソリューション):私は完全に、すなわち、公共のデフォルトCTOR、コピーctorのとデストラクタを提供し、私のクラスを定義に持っていました。 (強調は私です)the documentationから

// somewhere in Foo.h 
#include <QMetaType> 

namespace nm{ 
struct Foo 
{ 
    Foo(); 
    Foo(const Foo& other); 
    ~Foo(); 

    void bar(); 
}; 
} 

Q_DECLARE_METATYPE(nm::Foo) 
+1

ヘッダファイルに 'Q_DECLARE_METATYPE'が入ります。 http://doc.qt.io/qt-5/qmetatype.html – drescherjm

+0

ドキュメントには、次のような記述があります。*** MyStructが名前空間にある場合、Q_DECLARE_METATYPE()マクロは外部にある必要があります名前空間:*** – drescherjm

答えて

1

:最終的なコードは次のようになります

This macro makes the type Type known to QMetaTypeas long as it provides a public default constructor, a public copy constructor and a public destructor. It is needed to use the type Type as a custom type in QVariant .

This macro requires that Type is a fully defined type at the point where it is used.

ヘッダーのみのソリューションが動作する理由です、そして私の知る限り方法はありませんが、の完全な定義を提供することメタタイプとして宣言する前に入力してください。

関連する問題