我有一个使用QtScript进行某些自动化的程序。我加了一堆C++函数和类的脚本引擎的全球范围,使脚本可以访问它们,就像这样:作为全局对象的QScriptValue的深层副本
QScriptValue fun = engine->newFunction(systemFunc);
engine->globalObject().setProperty("system", fun);
我希望能够连续运行多个脚本,每个一个新的全球状态。因此,如果一个脚本设置了一个全局变量,如
myGlobalVar = "stuff";
我希望在下一个脚本运行之前擦除变量。我这样做的方法是制作脚本引擎的全局对象的深层副本,然后在脚本完成运行时恢复它。但深副本没有工作,因为我system
功能突然错误打破:
TypeError: Result of expression 'system' [[object Object]] is not a function.
这里是我深深的复制功能,改编自:
http://qt.gitorious.org/qt-labs/scxml/blobs/master/src/qscxml.cpp
QScriptValue copyObject(const QScriptValue& obj, QString level = "")
{
if(obj.isObject() || obj.isArray()) {
QScriptValue copy = obj.isArray() ? obj.engine()->newArray() : obj.engine()->newObject();
copy.setData(obj.data());
QScriptValueIterator it(obj);
while(it.hasNext()) {
it.next();
qDebug() << "copying" + level + "." + it.name();
if(it.flags() & QScriptValue::SkipInEnumeration)
continue;
copy.setProperty(it.name(), copyObject(it.value(), level + "." + it.name()));
}
return copy;
}
return obj;
}
(该SkipInEnumeration
被放入以避免无限循环)
编辑:问题的一部分,我认为是在调试器(QScriptEngineDebugger)中,我添加的函数和构造函数应该是显示为类型Function
,但在复制之后,它们显示为类型Object
。我还没有找到创建一个重复现有函数的新函数的一个好方法(QScriptEngine :: newFunction接受一个实际的函数指针)。
在我的例子中`isVariant()`至少为数字返回false。我不得不添加一个`isNumber()`的情况(以及所有其他原语来预防)。 – Olivetree 2017-01-24 18:42:02