2016-08-22 140 views
0

在Qt 4.8中,從C++端有可能在QScriptEngine中設置QScriptValue - 本地值?在評估之前設置QScriptValue - 本地值

例如,假設我有:

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 

顯而易見的解決人爲的例子上面只作「祿」全球和設置+相應地重置,但由於這個問題,這不是我正在尋找分心的原因。我想:

  • 「祿」是本地到每個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作爲有效答案。

回答

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評估將使用它。相同名稱的預存變量將被後續上下文覆蓋。

我想需要注意的是,你必須做出推→所有評價→流行原子,而不是個人的評價,如果你要爲多個線程和一個引擎。我希望有一種方法可以將上下文傳遞給evaluate()