我有一个使用 QtScript 进行自动化的程序。我在脚本引擎的全局范围内添加了一堆 C++ 函数和类,以便脚本可以访问它们,如下所示:
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)中,我添加的函数和构造函数应该显示为 type Function
,但在复制后,它们显示为 type Object
。我还没有找到一种创建复制现有函数的新函数的好方法(QScriptEngine::newFunction 需要一个实际的函数指针)。