在评估

时间:2016-08-22 22:33:11

标签: c++ qt qt4 qtscript

在Qt 4.8中,是否可以从C ++方面设置QScriptValue - 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作为有效答案。

1 个答案:

答案 0 :(得分: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()