4

QScriptEngine 具有评估()方法,可用于加载脚本,执行它并从已加载的脚本中运行指定的函数。但是如何清除当前脚本并加载一个新脚本呢?例如,我使用 evaluate() 从文件加载脚本,然后使用 evaluate() 获取脚本函数并调用它们。但是我能做些什么来清除当前脚本并从不同的文件加载一个新脚本?删除和创建 QScriptEngine 似乎是一种解决方案,但它喜欢在 GUI 线程中创建(由于 QScriptEngineDebugger),而所有脚本操作都在单独的线程中执行。那么有没有办法在不重新创建 QScriptEngine 对象的情况下清除当前脚本?

4

3 回答 3

7
engine.pushContext();
engine.evaluate("...");
engine.popContext();
engine.pushContext();
engine.evaluate("...");
engine.popContext();

在评估脚本之前调用 pushContext() 并在评估新脚本之前调用 popContext() 将有效地清除所有脚本数据。

于 2010-01-12T10:46:41.797 回答
2

我遇到了这个问题,并想改进地狱之眼的答案(谢谢,顺便说一句!),因为它遗漏了一个重要的细节。

我将使用我的问题的简化版本,我正在重用一个QScriptEngine对象并希望确保在评估之间没有留下任何东西。特别是,我想确保onEquipped没有为"RC Helicopter Controller"实体调用该函数,因为它在配备时不会更改其 sprite,因此不会onEquipped在其脚本文件中定义函数。简单地使用pushContext()andpopContext()根本不会调用任何内容:

#include <QtCore>
#include <QtScript>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QScriptEngine scriptEngine;

    scriptEngine.pushContext();
    scriptEngine.evaluate("function onEquipped(entity) { print('changing pixmap to equipped sprite for ' + entity); }").toString();
    QScriptValueList args;
    args << QScriptValue("Pistol");
    scriptEngine.globalObject().property("onEquipped").call(QScriptValue(), args);
    scriptEngine.popContext();

    scriptEngine.pushContext();
    args.clear();
    args << QScriptValue("RC Helicopter Controller");
    scriptEngine.globalObject().property("onEquipped").call(QScriptValue(), args);
    scriptEngine.popContext();

    return 0;
}

函数调用似乎发生在原始上下文中,而不是当前上下文中。在查看QScriptEngine::pushContext()文档时,我看到您需要显式使用从它返回的上下文,最重要的是,您必须使用QScriptEngine::activationContext()来访问任何变量:

#include <QtCore>
#include <QtScript>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QScriptEngine scriptEngine;

    scriptEngine.pushContext();
    scriptEngine.evaluate("function onEquipped(entity) { print('changing pixmap to equipped sprite for ' + entity); }").toString();
    QScriptValueList args;
    args << QScriptValue("Pistol");
    scriptEngine.currentContext()->activationObject().property("onEquipped").call(QScriptValue(), args);
    scriptEngine.popContext();

    scriptEngine.pushContext();
    args.clear();
    args << QScriptValue("RC Helicopter Controller");
    scriptEngine.currentContext()->activationObject().property("onEquipped").call(QScriptValue(), args);
    scriptEngine.popContext();

    return 0;
}

将像素图更改为手枪的装备精灵

于 2014-04-17T14:19:39.830 回答
0

您可以尝试将一个空对象设置为http://qt.nokia.com/doc/4.6/qscriptengine.html#setGlobalObject

也许这行得通。

于 2010-01-11T11:28:01.517 回答