首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么等同于qtScript上的JavaScript的setTimeout?

什么等同于qtScript上的JavaScript的setTimeout?
EN

Stack Overflow用户
提问于 2012-06-28 09:29:32
回答 5查看 4.8K关注 0票数 11

没什么好补充的;qtScript上的JavaScript的setTimeout是什么等价物?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-07-11 23:39:00

下面介绍了如何通过提供一个自包含的C++方法来扩展脚本语言(不需要记账计时器ids之类的内容)。只需创建名为“setTimeout”的插槽:

代码语言:javascript
复制
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-function,并在引擎现有的全局对象上设置相应的命名属性。然而,在我的例子中,整个ScriptGlobalObject实例被设置为新的全局对象,如下所示:

代码语言:javascript
复制
mScriptGlobalObject = new ScriptGlobalObject(this);
engine->setGlobalObject(engine->newQObject(mScriptGlobalObject));

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

代码语言:javascript
复制
class ScriptGlobalObject : public QObject, protected QScriptable

在脚本中,您现在可以使用setTimeout在以后调用一个方法(只要产生该方法的QScriptEngine实例在此期间没有被删除):

代码语言:javascript
复制
setTimeout(function() {
  // do something in three seconds
}, 3000);
票数 3
EN

Stack Overflow用户

发布于 2016-03-30 20:56:38

您可以将QTimer作为可实例化的类公开给脚本引擎。然后,您可以通过new QTimer()实例化它。

Making Applications Scriptable中记录了这一点。

下面是一个完整的例子。计时器在脚本求值后触发一秒钟,在控制台上打印timeout,然后退出应用程序。

代码语言:javascript
复制
// https://github.com/KubaO/stackoverflown/tree/master/questions/script-timer-11236970
#include <QtScript>

template <typename T> void addType(QScriptEngine * engine) {
   auto constructor = engine->newFunction([](QScriptContext*, QScriptEngine* engine){
      return engine->newQObject(new T());
   });
   auto value = engine->newQMetaObject(&T::staticMetaObject, constructor);
   engine->globalObject().setProperty(T::staticMetaObject.className(), value);
}

int main(int argc, char ** argv) {
   QCoreApplication app{argc, argv};

   QScriptEngine engine;
   addType<QTimer>(&engine);
   engine.globalObject().setProperty("qApp", engine.newQObject(&app));

   auto script =
         "var timer = new QTimer(); \n"
         "timer.interval = 1000; \n"
         "timer.singleShot = true; \n"
         "var conn = timer.timeout.connect(function(){ \n"
         "  print(\"timeout\"); \n"
         "  qApp.quit(); \n"
         "}); \n"
         "timer.start();\n";

   engine.evaluate(script);
   return app.exec();
}
票数 3
EN

Stack Overflow用户

发布于 2013-03-12 05:14:26

setTimeout和setInterval没有在ECMAScript规范中定义,因为它们不是JavaScript特性。这些函数是浏览器环境的一部分。所以,QTscript没有它们。

您可以使用QTimer来实现此功能。下面是如何在QTScript中使用它的快速代码。

代码语言:javascript
复制
var timer = new QTimer();
timer.interval = 100; // set the time in milliseconds
timer.singleShot = true; // in-case if setTimout and false in-case of setInterval 
timer.timeout.connect(this, function(){console("in setTimout")});
timer.start();

注意有没有bug,我刚在这里写了代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11236970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档