在 Qt 4.8 的脚本引擎中,“局部”变量可以通过获取 aQScriptContext
来设置,QScriptEngine::pushContext
然后设置其激活对象的属性。这只能在 push/pop 调用中完成,因为这是 a 唯一QScriptContext
可用的地方,而 AFAICT 没有等效的QScriptEngine#evaluate
aQScriptContext
用作环境:
QScriptEngine engine;
QScriptContext *local;
local = engine.pushContext();
local->activationObject().setProperty("value", 2); // set value=2
qDebug() << engine.evaluate("value").toNumber(); // outputs 2
engine.popContext();
是否有某种方法可以维护一个环境以用于推送/弹出调用之外的评估?例如,我尝试创建一个QScriptValue
用作激活对象,然后设置它:
QScriptEngine engine;
QScriptContext *local;
// Use ao as activation object, set variables here, prior to pushContext.
QScriptValue ao;
ao.setProperty("value", 1);
// Test with ao:
local = engine.pushContext();
local->setActivationObject(ao);
qDebug() << engine.evaluate("value").toNumber();
engine.popContext();
但这不起作用。它输出nan
而不是1
,value
未定义。由于某种原因setActivationObject
没有改变价值。
我的总体目标是:
- 在评估代码之外设置本地环境。
pushContext
然后在评估和调用之间的脚本时使用预先配置的本地环境popContext
,而不必每次都重新设置该环境中的所有变量。
所以:
- 有没有办法做到这一点?
- 是否有可能我在正确的轨道上但我设置不
ao
正确?例如,有一个未记录的文件QScriptEngine#newActivationObject()
在使用时会产生“未实现”错误,也许这是一个提示?
如何设置本地上下文但基本上不必在每次推送上下文时重新配置它(因为每次弹出上下文时它基本上都会丢失)。