gpt4 book ai didi

c++ - 有没有办法在 QScriptEngine#pushContext/popContext 之外维护 Qt 脚本上下文环境?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:53 26 4
gpt4 key购买 nike

在Qt 4.8 的脚本引擎中,“本地”变量可以通过obtaining a QScriptContext from QScriptEngine::pushContext then setting the properties of its activation object 来设置。 .这只能在 push/pop 调用中完成,因为那是唯一一个 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();

是否有某种方法可以维护一个环境,以便在 推/弹出调用之外进行评估?例如,我尝试创建一个 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没有改变值(value)。

我的总体目标是:

  1. 在评估代码之外设置本地环境。
  2. 然后在 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();
}

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

#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();
}

关于c++ - 有没有办法在 QScriptEngine#pushContext/popContext 之外维护 Qt 脚本上下文环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39128858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com