Qml计时器未在正确的时间间隔内触发

时间:2014-03-31 01:18:09

标签: qt timer qml qt5 qt-quick

我已经创建了一个计时器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

3 个答案:

答案 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()
    }
}

重复和运行都应该为真。