0

Qt 4.8 で、C++ 側からQScriptValue-local 値を aに設定することは可能QScriptEngineですか?

たとえば、私が持っているとしましょう:

QScriptEngine engine;
engine.globalObject().setProperty("glob", 1000);

// ???: Set loc to, say, 42.
QScriptValue expr1 = engine.evaluate("glob + loc");
qDebug() << expr1.toNumber();

// ???: Set loc to, say, 99.
QScriptValue expr2 = engine.evaluate("glob + loc");
qDebug() << expr2.toNumber();

そして、その出力を次のようにしたいと思います。

1042
1099

上記の人為的な例に対する明白な解決策は、「loc」をグローバルにして、それに応じて設定 + リセットすることですが、この質問から気をそらす理由から、それは私が探しているものではありません。私は…したい:

  • 「loc」はそれぞれにローカルですQScriptValue
  • スクリプトの前に追加するなどして、スクリプト文字列を人為的に変更しないQString().sprintf("loc = %d;", 42)ようにします。
  • 単一のQScriptEngine.

私が実際に試してみることができた唯一のことは次のとおりです。

QScriptValue expr1 = engine.evaluate("glob + loc");
expr1.setProperty("loc", 42);
qDebug() << expr1.toNumber();

しかし、値はすでに によって完全に評価されevaluate()ているようでsetProperty()、効果はありません (驚くことではありません)。

私はまた、QScriptProgramそれがプログラムローカル環境を提供することを望んでいましたが、悲しいかな。

ドキュメントを見ており、これを投稿した後もそれらを見続けますが、これを使用するのはこれが初めてでありQScriptEngine、私の脳がどろどろになっていることを認めなければならないので、それが正しいかどうか、完全に謝罪します明らか。RTFM を有効な回答として受け入れます。

4

1 に答える 1

0

私はそれを理解しました、少なくともこれが最善の方法だと思います。キーは次QScriptEngine#pushContext()#popContext()とおりです。

QScriptEngine engine;
engine.globalObject().setProperty("glob", 1000);

QScriptContext *local;

local = engine.pushContext();
local->activationObject().setProperty("loc", 42);    
QScriptValue expr1 = engine.evaluate("glob + loc");
engine.popContext();

qDebug() << expr1.toNumber();

local = engine.pushContext();
local->activationObject().setProperty("loc", 99);    
QScriptValue expr2 = engine.evaluate("glob + loc");
engine.popContext();

qDebug() << expr2.toNumber();

QScriptContextそして、与えられたものがスタック上でアクティブである限り、すべてのQScriptValue評価がそれを使用します。同じ名前の既存の変数は、後続のコンテキストによってオーバーライドされます。

私が推測する注意点は、複数のスレッドと 1 つのエンジンを使用する場合は、個々の評価ではなく、プッシュ → すべての評価 → ポップアトミックにする必要があることです。にコンテキストを渡す方法があればいいのにと思いますevaluate()

于 2016-08-22T23:00:49.047 に答える