0

在 Qt 4.8 中,从 C++ 端是否可以QScriptValue在 a 中设置 -local 值QScriptEngine

例如,假设我有:

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 作为有效答案。

4

1 回答 1

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评估都会使用它。先前存在的同名变量将被后续上下文覆盖。

我想需要注意的是,如果您要使用多个线程和一个引擎,则必须使push → all evaluations → pop atomic,而不是单独的评估。我希望有一种方法可以将上下文传递给evaluate().

于 2016-08-22T23:00:49.047 回答