Jas*_*n C 6 c++ qt qt4 qtscript
在Qt 4.8的脚本引擎,"局部"变量可通过设置获得QScriptContext
从QScriptEngine::pushContext
再设置其激活对象的属性.这只能在推/弹调用中完成,因为这是唯一QScriptContext
可用的地方,而AFAICT没有相当于QScriptEngine#evaluate
它QScriptContext
用作环境:
QScriptEngine engine;
QScriptContext *local;
local = engine.pushContext();
local->activationObject().setProperty("value", 2); // set value=2
qDebug() << engine.evaluate("value").toNumber(); // outputs 2
engine.popContext();
Run Code Online (Sandbox Code Playgroud)
有没有办法维护一个环境,以便在推/弹调用之外使用评估?例如,我尝试创建一个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();
Run Code Online (Sandbox Code Playgroud)
但这不起作用.它输出nan
代替1
,作为value
未定义.由于某种原因setActivationObject
没有改变价值.
我的总目标是:
pushContext
和popContext
调用之间的脚本时使用该预配置的本地环境,而不必每次都重新设置该环境中的所有变量.所以:
ao
不当?例如,有一个未记录的文件QScriptEngine#newActivationObject()
在使用时产生"未实现"的错误,也许这是一个提示?我如何设置本地上下文,但基本上不必在每次推送上下文时重新配置它(因为每次弹出上下文时它基本上都会丢失).
您可以使用全局对象。它将在所有评估中共享财产价值:
#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();
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您不想要全局范围:
#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();
}
Run Code Online (Sandbox Code Playgroud)