没有太多的增加; 什么是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