我想在
javascript中创建一个延迟函数,它需要一段时间的参数来延迟,所以我可以使用它在QML应用程序中执行
JavaScript行之间引入延迟.它可能看起来像这样:
function delay(delayTime) {
// code to create delay
}
我需要body的函数delay().请注意,javascript的setTimeout()在QML中不起作用.
解决方法
如您对此问题的意见所建议的,Timer组件是一个很好的解决方案.
function Timer() {
return Qt.createQmlObject("import QtQuick 2.0; Timer {}",root);
}
timer = new Timer();
timer.interval = 1000;
timer.repeat = true;
timer.triggered.connect(function () {
print("I'm triggered once every second");
})
timer.start();
以上将是我如何使用它,这是我可能在你的问题中实现了这个例子.
function delay(delayTime) {
timer = new Timer();
timer.interval = delayTime;
timer.repeat = false;
timer.start();
}
(没有做任何事情;继续阅读)
虽然您正在寻找实现它的确切方式表明您正在寻找阻止,直到您的程序的下一行执行.但是,这并不是一个非常好的方式,因为它也会阻止程序中的所有其他内容,因为JavaScript只能在一个执行线程中运行.
另一种方法是传回回调.
function delay(delayTime,cb) {
timer = new Timer();
timer.interval = delayTime;
timer.repeat = false;
timer.triggered.connect(cb);
timer.start();
}
这将允许您使用它.
delay(1000,function() {
print("I am called one second after I was started.");
});
希望有帮助!
编辑:以上假设您正在单独的JavaScript文件中工作,以后您将导入到QML文件中.要直接在QML文件中执行等效操作,可以这样做.
import QtQuick 2.0
Rectangle {
width: 800
height: 600
color: "brown"
Timer {
id: timer
}
function delay(delayTime,cb) {
timer.interval = delayTime;
timer.repeat = false;
timer.triggered.connect(cb);
timer.start();
}
Rectangle {
id: rectangle
color: "yellow"
anchors.fill: parent
anchors.margins: 100
opacity: 0
Behavior on opacity {
NumberAnimation {
duration: 500
}
}
}
Component.onCompleted: {
print("I'm printed right away..")
delay(1000,function() {
print("And I'm printed after 1 second!")
rectangle.opacity = 1
})
}
}
我不相信这是解决你实际问题的方法;要延迟动画,可以使用PauseAnimation.