在求值之前设置QScriptValue-local值

Setting QScriptValue-local values prior to evaluating

本文关键字:设置 QScriptValue-local      更新时间:2023-10-16

是否有可能,在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"全局化,并相应地设置和重置它,但由于分散了这个问题的原因,这不是我想要的。我想:
  • "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作为有效的答案。

我明白了,至少我认为这是最好的方法。关键是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的计算都将使用它。已存在的同名变量将被后续上下文覆盖。

我猜需要注意的是你必须让push →所有评估→如果要使用多个线程和一个引擎,请使用原子计算,而不是单独计算。我希望有一种方法来传递上下文到evaluate() .