以下是如何通过提供独立的 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()));
}
并将该槽作为函数引入到脚本引擎的全局对象中。这可以通过不同的方式来完成,例如只需通过 QScriptEngine 实例创建一个 QScriptValue 函数,并在引擎的现有全局对象上设置相应命名的属性。然而,就我而言,整个 ScriptGlobalObject 实例被设置为新的全局对象,如下所示:
mScriptGlobalObject = new ScriptGlobalObject(this);
engine->setGlobalObject(engine->newQObject(mScriptGlobalObject));
请注意,如果您想使用上面 setTimeout 代码中所示的“context()”,您的 ScriptGlobalObject 也应该从 QScriptable 派生,如下所示:
class ScriptGlobalObject : public QObject, protected QScriptable
在脚本中,您现在可以使用 setTimeout 稍后调用一个方法(只要同时不删除它所源自的 QScriptEngine 实例):
setTimeout(function() {
// do something in three seconds
}, 3000);