什么是JavaScript对qtScript的setTimeout的相同呢?(What is the

2019-06-25 20:21发布

没有太多的增加; 什么是JavaScript对qtScript的setTimeout的相同呢?

Answer 1:

下面是你可以扩展你的脚本语言,通过提供一个独立的C ++方法(无需定时IDS左右的簿记)。 只需创建一个名为“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,你ScriptGlobalObject也应该从QScriptable派生,就像这样:

class ScriptGlobalObject : public QObject, protected QScriptable

在脚本,你现在可以使用的setTimeout有在稍后的时间调用(只要从它起源于其间不会被删除复制代码QScriptEngine实例)的方法:

setTimeout(function() {
  // do something in three seconds
}, 3000);


Answer 2:

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

这是在记录制造上的应用编写脚本 。

下面是一个完整的例子。 计时器触发第二脚本被评估之后,打印timeout在控制台上,并退出应用程序。

// 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();
}


Answer 3:

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

您可以使用QTimer来实现这一目标的功能。 下面是一个简单的代码如何在QTScript使用它。

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();

当心任何错误,我只是编码在这里。



Answer 4:

Qt的在“context2d”项目提供了一个实例的方式来访问,从脚本的setInterval / clearInterval的setTimeout / clearTimeout功能。

在“环境”这一类项目的,一个QObject的startTimer所函数被调用每个脚本调用的setInterval / setTimeout的时间。 然后定时器标识符在一个QHash添加上的JavaScript回调的参考。 当定时器的倒计时(C ++部分)结束时,“环境”类的timerEvent称为然后叫的JavaScript回调..

请注意,所有的定时器等环境::复位()以清洁的背景下丧生。

见: https://doc.qt.io/archives/qt-4.7/script-context2d.html



文章来源: What is the equivalent of JavaScript's setTimeout on qtScript?