2016-08-22 4 views
0

Qt 4.8ではC++側からローカル値をQScriptEngineに設定できますか?評価する前にQScriptValue-local値を設定する

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

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" globalとset +それに応じてリセットしますが、私が探しているものではないこの質問から気をそらす理由でそれをリセットします。私が欲しい:

  • を「LOC」、人為的に、例えば、スクリプト文字列を変更しない場合は、各QScriptValue
  • にローカルであるとQString().sprintf("loc = %d;", 42)の前に付いているか、スクリプトには何でも。
  • QScriptEngineを1つだけ使用する。

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

    しかし、それは価値がすでに完全にevaluate()によって評価されるので、setProperty()は何の影響(そこには驚きを)持っていないようだ:私は本当にしようとすると考えることができ

唯一のものでした。

私はまた、プログラムローカル環境を提供することを望んで、QScriptProgramでピークを見ました。

I がドキュメントで探しています、と私はこれを投稿した後、それらを見ていきますが、これは私がQScriptEngineを使用していると私は私の脳がドロドロに回っていることを是認しなければならない最初の時間であるだろうので、私それが正しければ謝罪してください。私はRTFMを有効な回答として受け入れます。

答えて

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()に渡す方法があることを望みます。

関連する問題