1

C++ 側でスクリプトの単純な操作の結果を取得しようとしています。

QScriptValue (myvar) を作成して呼び出しますengine.globalObject().setProperty("result", myvar); 。次に、"result = anothervar + 7;" を評価します。evaluate メソッドの戻り値は問題ありませんが、変数の結果は問題ありません。スクリプトが「result = anothervar + 7; a=1」の場合、結果の値は OK です。

Qt のバグであるにはあまりにもばかげているように見えます。

ありがとう

ジェフ

4

1 に答える 1

0

私のコメントに対するあなたの答えから、私はあなたがQScriptValue myvarインスタンスを保持していると仮定し、呼び出した後にそれを見てくださいevaluate():

QScriptEngine e;
QScriptValue myvar( 1.0 );
e.globalObject().setProperty( "result", myvar );
e.globalObject().setProperty( "anotherVar", QScriptValue( 14 ) );
const QScriptValue s = e.evaluate( "result = anotherVar + 7;" );
qDebug() << s.toVariant();
qDebug() << e.globalObject().property("result").toVariant();
qDebug() << myvar.toVariant();

これにより、「QVariant(double,21)」が 2 回、「QVariant(double,1)」が 1 回出力されます。これは予期される動作です。理由は次のとおりです。

JavaScript では、すべてがオブジェクトであり、オブジェクト自体ではなく、オブジェクトへの参照intのみを扱います (Java を知っている場合、これはvs.に似ていIntegerます)。したがって、代入が行うことは、グローバル オブジェクトの「結果」プロパティとしてresult = anotherVar + 7;表されるオブジェクトを、式の結果であるオブジェクトに置き換えることです。一方、QScriptValueはまだ (古い) オブジェクトを参照しており、そうでなければ、この時点でガベージ コレクターによって取得される可能性があります。myvaranotherVar + 7myvar

a=1問題を修正するための の追加について: ここでは再現できません。aもちろん、最初の debug ステートメントは の値を出力しますが、2 番目と 3 番目のステートメントは変更されていません。

したがって、問題の解決策は、( を使用してengine.globalObject().property("result")) 必要なときはいつでもエンジンから「結果」プロパティを常に再取得することです。つまり、QScriptValue は代入を追跡しません。

割り当てを追跡したい場合は、それをメソッド呼び出しに変換する必要があります。メソッドresultを使用してカスタム クラスとして実装し、割り当て ( ) をassign()に置き換えます。=result.assign( anotherVal + 7 );

于 2011-04-20T14:25:33.103 に答える