1

次のコードがあります。

QString* data = new QString("data to QML");
engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(data));

これは機能しません。QTCreator のエラー メッセージは次のとおりです。

...\qglobal.h:693: エラー: 静的アサーションに失敗しました: タイプが登録されていません。Q_DECLARE_METATYPE マクロを使用して Qt のメタオブジェクト システムに認識させてください #define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition) 、 メッセージ)

Q_DECLARE_METATYPE次のようなことをすると、 forを使用する必要があるとは思いませんQString

engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(QString("data to QML")));

それは正常に動作します。

QVariant::fromValue()事前に宣言された QStringでどのように使用できるかに興味があります。

4

2 に答える 2

4

QVariant::fromValue()へのポインタQStringではなく、 が必要QStringです。

さらに、ヒープにオブジェクトを割り当てるQStringことはあまり意味がありません。内部でQStringは、最適化としてコピー オン ライト (COW) を使用します。とにかく、に格納されている実際のデータQStringは常にヒープ上にあります。

于 2015-12-14T22:54:04.130 に答える
1

dataQStringは、それ自体ではなく、へのポインタQStringです。メソッドを使用するにはQVariant::fromValue()、ポインターを逆参照する必要があります。

engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(*data));
                                                                                            ^

これは、aQString *が (デフォルトで) 登録されたメタタイプではないためです。

于 2015-12-14T22:54:14.567 に答える