2

QJSEngine に基づいて、Qt 5 で javascript に公開された一連の C++ クラスがあります (Qt スクリプトは廃止されたようです)。

私の QObject 派生クラス A と B には Q_OBJECT マクロがあり、Q_DECLARE_METATYPE マクロも使用します。

クラスのファクトリ関数を公開して、JavaScript 内から新しいインスタンスを作成できるようにしました。以下はすべて正常に動作します。

a = namespace.createNewA(); // QJSEngine reports a type A object
b = namespace.createNewB(); // QJSEngine reports a type B object
b.SetParent(a); // SetParent is a slot of B taking a const A& parameter, gets called correctly
// But now.
b.GetParent(); // Reports QVariant(A), even though this is a slot: A GetParent() const

QVariant ではなく、JavaScript の GetParent が実際のタイプ A オブジェクトとして認識されるようにする方法はありますか?

4

1 に答える 1

2

元のコードの問題を理解しました:

  1. 戻り値で Qt スロットを使用することは、一般的なケースではおそらく良い考えではありません (例: Qt: スロットの戻り値の意味? を参照)。関数を Q_INVOKABLE に変更しましたが、実際には結果は変わりませんでしたが、続行する方が安全なように思えました。
  2. で返すことは、スクリプティング/ラッピングにとっても良い考えではないようです。デバッガーでコードを掘り下げると、QVariant の qobject へのキャストが失敗し、電球が消えたことがわかりました。QObject へのポインターを返すように呼び出しを変更したところ、QJSEngine はオブジェクトを正しいタイプとして報告するようになりました。

返された値は一時的なものだったので、これにはコードの設定にいくつかの変更が必要でしたが、私はそれを受け入れることができます。

于 2013-02-26T09:39:22.013 に答える