2016-08-24 25 views
6

在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未改变该值。

我的总体目标是:

  1. 设置本地环境的评价代码之外。
  2. 然后在评估pushContextpopContext调用之间的脚本时使用该预配置的本地环境,而不必每次重新设置该环境中的所有变量。

所以:

  • 有没有办法做到这一点?
  • 是否有可能我在正确的轨道上,但我设置了ao不正确?例如,有一个没有记录的QScriptEngine#newActivationObject(),它在使用时会产生“未实现”的错误,也许这是一个提示?

我怎样才能建立一个当地的情况,但基本上不会有我每次推上下文(因为它本质上是失去了好每一次我弹出上下文)时重新配置它。

回答

2

您可以使用全局对象。它将共享属性值翻过所有的评价:

#include <QCoreApplication> 
#include <QDebug> 
#include <QtScript/QScriptEngine> 
#include <QtScript/QScriptContext> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    QScriptEngine engine; 

    engine.globalObject().setProperty("value", 2); 
    engine.globalObject().setProperty("value2", 3); 

    qDebug() << engine.evaluate("value").toNumber(); // outputs 2 
    qDebug() << engine.evaluate("value2").toNumber(); // outputs 3 


    return a.exec(); 
} 

或者,如果你不想全局范围:

#include <QCoreApplication> 
#include <QDebug> 
#include <QtScript/QScriptEngine> 
#include <QtScript/QScriptContext> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    QScriptEngine engine; 
    QScriptContext *context; 

    QScriptValue scope = engine.newObject(); 
    scope.setProperty("value", 1); 
    scope.setProperty("value2", 2); 

    context = engine.pushContext(); 

    context->pushScope(scope); 
    qDebug() << engine.evaluate("value").toNumber(); // outputs 1 
    qDebug() << engine.evaluate("value2").toNumber(); // outputs 2 

    engine.popContext(); 

    return a.exec(); 
} 
+0

那太酷了,谢谢。看起来'QScriptContext#pushScope'没有记录在任何Qt版本中;所以我在Qt论坛上询问了它。显然它是内部的,并非真正用于公共用途,理论上这意味着它可以在任何时候消失,但另一方面,QtScript在新Qt版本中作为整体被弃用,所以它不会真的增加任何不存在的风险已经。它*确实*工作并符合我的要求,我不认为有更好的。谢谢! –

相关问题