匿名qt脚本函数的上下文?

时间:2013-04-01 21:41:06

标签: javascript qt qtscript

我想从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 ++构建“参数对象”的东西。有一个名为“参数”的属性,但似乎没有填写,或者我还没弄明白如何使用它。

1 个答案:

答案 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);
}

为简单起见,我没有包括三件事:

  1. 未实现otherObjectProto。请查看here示例。

  2. QThread :: sleep正在阻止当前线程,这可能是不可取的,但可以使用QTimer轻松修改它。

  3. engine-&gt; newQObject有其他参数,它定义了QObject的所有权,如果你不想要内存泄漏,请更好地阅读它。