2015-06-10 13 views
9

Rozważmy C++ oświadczenie (przykład from docs):QTimer :: SingleShot odpowiednik dla QML

QTimer::singleShot(600000, &app, SLOT(quit())); 

Jak zrobić to samo w .qml JavaScript, coś jak ten QML:

Rectangle { 
    property int counter: 0 
    onCounterChanged: { 
     if (counter > 42) { 
      // do equivalent of above C++ statement here 
     } 
    } 
    // more code, which actually manipulates counter 
} 

Tam jest oczywiste rozwiązanie polegające na oddzielnym Timer, który jest następnie uruchamiany przez ten kod JavaScript, i przyjmuję to jako odpowiedź, jeśli nie jest możliwe jednolinerowanie. Czy to jest?

+2

Równowartość byłaby [Timer] (http: // doc.qt.io/qt-5/qml-qtqml-timer.html). Ustaw 'repeat: false', aby uzyskać zachowanie pojedynczego strzału. –

+1

'repeat' to * false * domyślnie. – hyde

+1

Ładne pytanie. 'setTimeout' /' setInterval' są wykluczone, ponieważ nie mogą być użyte. Możesz rozważyć [tę odpowiedź] (http://stackoverflow.com/a/28514691/2538363) jako - raczej hackowskie - podejście. Poprzez ustawienie parametrów w sygnaturze funkcji można zmniejszyć użycie do pojedynczej linii, np. 'delay (/ * repeat */true, 12000, functionName)'. – BaCaRoZzo

Odpowiedz

6

Zmień właściwość "repeat" na wartość false dla obiektu Timer.

import QtQuick 1.0 

Item { 
    Timer { 
     id: timer 
     interval: 600000 
     running: false 
     repeat: false 
     onTriggered: Qt.quit() 
    } 

    Rectangle { 
     property int counter: 0 
     onCounterChanged: { 
      if (counter > 42) { 
       timer.running = true 
      } 
     } 
    } 
} 
+0

@hyde wyjaśnić odpowiedź dla ciebie kodu – Milovidov

7

skończyło się na dodanie tego do mojego main.qml:

Component { 
    id: delayCallerComponent 
    Timer { 
    } 
} 

function delayCall(interval, callback) { 
    var delayCaller = delayCallerComponent.createObject(null, { "interval": interval }); 
    delayCaller.triggered.connect(function() { 
     callback(); 
     delayCaller.destroy(); 
    }); 
    delayCaller.start(); 
} 

które mogą być używane tak:

delayCall(1000, function() { ... });