在Qt 4.8的脚本引擎中,“本地”变量可以由obtaining a QScriptContext
from QScriptEngine::pushContext
then setting the properties of its activation object设置。这只能推/弹出呼叫内完成,因为这是唯一的地方QScriptContext
可用并且AFAICT不存在QScriptEngine#evaluate
相当于接受一个QScriptContext
的环境中使用:有没有办法维护QScriptEngine#pushContext/popContext之外的Qt脚本上下文环境?
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()
,它在使用时会产生“未实现”的错误,也许这是一个提示?
我怎样才能建立一个当地的情况,但基本上不会有我每次推上下文(因为它本质上是失去了好每一次我弹出上下文)时重新配置它。
那太酷了,谢谢。看起来'QScriptContext#pushScope'没有记录在任何Qt版本中;所以我在Qt论坛上询问了它。显然它是内部的,并非真正用于公共用途,理论上这意味着它可以在任何时候消失,但另一方面,QtScript在新Qt版本中作为整体被弃用,所以它不会真的增加任何不存在的风险已经。它*确实*工作并符合我的要求,我不认为有更好的。谢谢! –