2016-08-22 6 views
0

Возможно ли, в Qt 4.8, со стороны C++ установить QScriptValue -local значения в 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 и установите + сбросить его соответствующим образом, но по причинам, которые отвлекают от этого вопроса, это не то, что я ищу. Я хотел бы:

  • «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 в качестве действительного ответа.

ответ

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().