我想从c ++执行一个匿名的Qt脚本函数,但无法找出要使用的QScriptContext。
这是脚本:
{
otherObject.Text = "Hello World";
setTimeout(function(otherObject) { otherObject.Text = "Goodbye World"; }, 9000 );
}
这是c ++中的setTimeout方法:
QScriptValue setTimeout( QScriptContext* ctx, QScriptEngine* eng )
{
// How can I obtain the correct context and arg list for the anonymous function here?
}
QScriptValue对象的调用方法需要上下文和参数列表:
call( ctx->thisObject(), ctx->argumentsObject() );
编辑:上下文可以是全局上下文,但构建参数列表以调用函数似乎是问题的关键。我没有看到任何解释如何从C ++构建“参数对象”的东西。有一个名为“参数”的属性,但似乎没有填写,或者我还没弄明白如何使用它。
答案 0 :(得分:2)
如果我们只看这个javascript代码:
{
otherObject.Text = "Hello World";
setTimeout(function(otherObject) { otherObject.Text = "Goodbye World"; }, 9000 );
}
setTimeout被告知等待9000,然后调用匿名函数。但是,问题是匿名函数有一个参数。并且setTimeout函数不知道要传递给函数的参数。
<html>
<script>
var otherObject = 'Hello World';
setTimeout(function(otherObject){alert(otherObject);}, 1000);
</script>
</html>
如果你在chrome中尝试这个代码,它会提示undefined,因为setTimeout函数不知道传递给匿名函数的内容,它只是不传递任何参数。
但如果你试试这个:
<html>
<script>
var otherObject = 'Hello World';
setTimeout(function(){alert(otherObject);}, 1000);
</script>
</html>
它将提醒Hello世界,因为现在otherObject不再是匿名函数的参数,而是一个局部变量,它与匿名函数形成一个闭包。
因此,为了使代码正常工作,setTimeout函数应该与浏览器的setTimeout函数不同。如果要从C ++端设置匿名函数的参数,可以执行以下操作:
QScriptValue setTimeout( QScriptContext* ctx, QScriptEngine* eng )
{
QScriptValue anonymous_callback = ctx->argument(0);
QScriptValue time = ctx->argument(1);
QThread::sleep(time.toInt32())
// Then Invoke the anonymous function:
QScriptValueList args;
otherObjectProto * otherObjectQtSide = new otherObjectProto();
otherObjectQtSide.setProperty("Text","Goodbye World!");
QScriptValue otherObject = engine->newQObject(otherObjectQtSide);// engine is pointer to the QScriptEngine instance
args << otherObject;
anonymous_callback.call(QScriptValue(),args);
}
为简单起见,我没有包括三件事:
未实现otherObjectProto。请查看here示例。
QThread :: sleep正在阻止当前线程,这可能是不可取的,但可以使用QTimer轻松修改它。
engine-&gt; newQObject有其他参数,它定义了QObject的所有权,如果你不想要内存泄漏,请更好地阅读它。