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