struct
QWizard
ページ内に私のカスタムを使用しています。例えば、私はタイプnm::Foo
のQ_PROPERTY
とregisterField
にできるようにしたいヘッダファイルとソースファイルを使用するときに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)
ヘッダファイルに 'Q_DECLARE_METATYPE'が入ります。 http://doc.qt.io/qt-5/qmetatype.html – drescherjm
ドキュメントには、次のような記述があります。*** MyStructが名前空間にある場合、Q_DECLARE_METATYPE()マクロは外部にある必要があります名前空間:*** – drescherjm