6

オブジェクトをグローバル プロパティとして、以下のメソッドを持つ Java Script に公開しようとしています。

Q_INVOKABLE MyObject* createMyObject();

MyObject は QObject から派生しています。

Java Script でこのメソッドを呼び出すと、次のタイプのオブジェクトが返されます。

QVariant(MyObject*)

スクリプトでさらに使用できるように、自動的に QJSValue に変換できるかどうか疑問に思っていますか?

4

4 に答える 4

4

Java Scriptは、QVariantを「不明な」タイプの不透明なラッパーとして使用しているようです。値は簡単に渡すことができますが、そのプロパティやメソッドを呼び出すことはできません。スクリプトで使用するには、QJSValueに変換する必要があります。私が見つけた唯一の方法は、次のようなヘルパー関数を宣言することです。

Q_INVOKABLE QJSValue convert(QVariant var)
{
    return _engine.newQObject(var.value<QObject*>());
}

次に、QVariantをQJSValueに変換することができます。

var obj = convert(createMyObject());

objはタイプになります

MyObject

これで、スクリプトで使用できるようになりました。

于 2013-01-21T13:15:14.967 に答える
3

スクリプトでMyObjectを参照する前に、以下のどこかでメソッドを呼び出すだけです。

qmlRegisterType<MyObject>("", 1, 0, "MyObject");

次に、createMyObjectメソッドは変換なしで正しいタイプを返します。

var obj = createMyObject();

MyObject

実際、以下の方法の種類を変更すると

Q_INVOKABLE MyObject* createMyObject();

Q_INVOKABLE QObject* createMyObject();

なくても動作し始めます

qmlRegisterType
于 2013-02-26T13:41:41.893 に答える
2

メソッドを使用できますQJSEngine::newQObject()

newQObject()を使用して、 QObject (またはサブクラス) ポインターをラップします。newQObject()はプロキシ スクリプト オブジェクトを返します。QObjectのプロパティ、子、およびシグナルとスロットは、プロキシ オブジェクトのプロパティとして使用できます。Qt メタ オブジェクト システムを使用して動的に行われるため、バインディング コードは必要ありません。

詳細については、QJSEngine クラス: QObject 統合を参照してください。

于 2013-01-19T08:36:53.283 に答える
0

私は同様の状況にあり、スクリプト作成に QJSEngine を使用しようとしています (現時点では、QList を QJSEngine に公開しようとして立ち往生しています...)

既存の C++ オブジェクトをスクリプトに公開する最も簡単な方法は次のようになると思います。

//create c++ file object
MyObject* anObject = new MyObject();

//make c++ object available to script
QJSValue scriptObject = myEngine.newQObject(anObject);
myEngine.globalObject().setProperty("obj", scriptObject);

これで、スクリプトから「obj」にアクセスできるはずです。

ところで、スクリプト (QVariant(MyObject*)) の型を調べるにはどうすればよいでしょうか。

于 2013-07-02T16:58:24.500 に答える