在qtScript上JavaScript的setTimeout相当于什么?

Mai*_*tor 10 javascript timer settimeout qtscript

没什么可补充的; 在qtScript上JavaScript的setTimeout相当于什么?

Der*_*anu 3

以下是如何通过提供独立的 C++ 方法来扩展脚本语言(无需记录计时器 ID 等)。只需创建以下名为“setTimeout”的槽:

void ScriptGlobalObject::setTimeout(QScriptValue fn, int milliseconds)
{
  if (fn.isFunction())
  {
    QTimer *timer = new QTimer(0);
    qScriptConnect(timer, SIGNAL(timeout()), QScriptValue(), fn);
    connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater()));
    timer->setSingleShot(true);
    timer->start(milliseconds);
  } else
    context()->throwError(tr("Passed parameter '%1' is not a function.").arg(fn.toString()));
}
Run Code Online (Sandbox Code Playgroud)

并将该槽作为函数引入到脚本引擎的全局对象中。这可以通过不同的方式完成,例如,仅通过 QScriptEngine 实例创建 QScriptValue 函数,并在引擎的现有全局对象上设置相应命名的属性。然而,就我而言,整个 ScriptGlobalObject 实例被设置为新的全局对象,如下所示:

mScriptGlobalObject = new ScriptGlobalObject(this);
engine->setGlobalObject(engine->newQObject(mScriptGlobalObject));
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想使用上面 setTimeout 代码中所示的“context()”,您的 ScriptGlobalObject 也应该从 QScriptable 派生,如下所示:

class ScriptGlobalObject : public QObject, protected QScriptable
Run Code Online (Sandbox Code Playgroud)

在脚本中,您现在可以使用 setTimeout 稍后调用一个方法(只要同时不删除它所源自的 QScriptEngine 实例):

setTimeout(function() {
  // do something in three seconds
}, 3000);
Run Code Online (Sandbox Code Playgroud)