2014-03-31 128 views
7

我創建了一個計時器QML應用程序,並使用了Timer qml組件。 間隔設置爲1000毫秒(默認值)...但它似乎只在應用程序專注於它時正常工作。 當我把它放在後臺時,它似乎並沒有每次都觸發,因此我在應用程序中出現了一些錯誤。在正確的時間間隔內未觸發Qml計時器

我試圖找到文檔中涉及到的東西,但我不能 定時器代碼是非常簡單的:

Timer { 
    id: timer 
    repeat: true 
    onTriggered: {msRemaining -= 1000; Core.secondsToText(type);} 
} 

任何人有關於如何解決它的任何想法?

版本: Qt的5.2 QML 2.0 OS X 10.9

回答

8

的QML定時器元件與動畫定時器同步。由於動畫定時器通常設置爲60fps,因此定時器的分辨率最多爲16ms。你還應該注意到,在Qt Quick 2中,動畫定時器被同步到屏幕刷新(而在Qt Quick 1中,它被硬編碼爲16ms)。所以,當你的應用程序在後臺運行時,我認爲刷新已停止,因此,同步到屏幕刷新的計時器將停止正常工作。

如果您想使用定時器顯示流逝的時間,因爲這樣做不是一個好主意,因爲它不準確。您可以使用像JavaScript日期()函數:

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 
    } 
} 
+0

感謝您的回答。 如何在Qt Quick 2中顯示已用時間的最佳方式? – danielfranca

+0

我編輯了顯示答案的答案,以顯示經過的時間。 – Nejat

+0

屏幕關閉5分鐘後是否可能觸發事件? –

1

我有一個Timer對象QML的應用程序,運行在Android上:

  • 有了Qt 4.8,定時器工作正常時,QML應用在後臺。

  • 在Qt 5.4中,當QML應用程序在後臺時Timer不再工作。例如,QML應用程序不能再接收onTriggered()信號。當QML應用程序再次返回到前臺時,Timer再次開始工作。在QML應用程序處於後臺時,似乎Qt信號被阻止。

所以這看起來像Qt中的迴歸。最好的解決辦法是等到這個迴歸是固定的。

+0

這個迴歸似乎已經在Qt 5.5 alpha版本中得到修復。所以這個修復很可能在Qt 5.5官方發佈中可用。 – jonathanzh