我已经创建了一个计时器QML应用程序,并且我使用了Timer qml组件。 间隔设置为1000毫秒(默认值为1)......但只有当应用程序关注它时,它似乎才能正常工作。 当我把它放在后台时,它似乎并没有每次触发,因此我在应用程序中遇到了一些错误。
我试图在文档中找到与此相关的任何内容,但我无法做到 计时器代码非常简单:
Timer {
id: timer
repeat: true
onTriggered: {msRemaining -= 1000; Core.secondsToText(type);}
}
任何人都对此有所了解以及如何解决这个问题?
版本: Qt 5.2 QML 2.0 OS X 10.9
答案 0 :(得分:9)
QML Timer元素与动画计时器同步。由于动画计时器通常设置为60fps,因此Timer的分辨率最多为16ms。您还应注意,在Qt Quick 2中,动画计时器与屏幕刷新同步(而在Qt Quick 1中,它被硬编码为16ms)。因此,当您的应用程序在后台运行时,我认为刷新已停止,因此同步到屏幕刷新的计时器将停止正常工作。
如果您想使用计时器显示已用时间,那么这不是一个好主意,因为它不准确。您可以使用javascript Date()函数,如:
import QtQuick 2.0
Item {
id: root
width: 200; height: 230
property double startTime: 0
property int secondsElapsed: 0
function restartCounter() {
root.startTime = 0;
}
function timeChanged() {
if(root.startTime==0)
{
root.startTime = new Date().getTime(); //returns the number of milliseconds since the epoch (1970-01-01T00:00:00Z);
}
var currentTime = new Date().getTime();
root.secondsElapsed = (currentTime-startTime)/1000;
}
Timer {
id: elapsedTimer
interval: 1000;
running: true;
repeat: true;
onTriggered: root.timeChanged()
}
Text {
id: counterText
text: root.secondsElapsed
}
}
答案 1 :(得分:1)
我有一个带有Timer对象的QML应用程序,在Android上运行:
使用Qt 4.8,当QML应用程序在后台时,定时器工作正常。
使用Qt 5.4,当QML应用程序在后台时,计时器不再有效。例如,QML应用程序无法再接收onTriggered()信号。当QML应用程序再次返回前台时,Timer再次开始工作。当QML应用程序在后台时,Qt信号似乎被阻止。
所以这看起来像Qt中的回归。最好的解决方案是等到这个回归得到修复。
答案 2 :(得分:0)
这是对我有用的代码段,它应位于ApplicationWindow{}
或Item{}
元素中。
Timer{
id: closeTimer
interval: 10000
repeat: true
running: true
onTriggered: {
drawer.close()
}
}
重复和运行都应该为真。