2015-06-10 14 views
9

Considerate questa affermazione C++ (ad esempio from docs):QTimer :: SingleShot equivalente per QML

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

Come fare lo stesso in .qml JavaScript, qualcosa di simile QML:

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

C'è il ovvia soluzione di avere separato Timer, che viene quindi avviato da questo codice JavaScript, e lo accetterò come risposta se un one-liner non è possibile. È?

+2

L'equivalente sarebbe [Timer] (http: // doc.qt.io/qt-5/qml-qtqml-timer.html). Imposta 'repeat: false' per ottenere il comportamento di tiro singolo. –

+1

'repeat' è * false * di default, in realtà. – hyde

+1

Bella domanda. 'setTimeout' /' setInterval' sono fuori questione poiché non possono essere utilizzati. Puoi considerare [questa risposta] (http://stackoverflow.com/a/28514691/2538363) come un approccio - piuttosto hacker -. Impostando i parametri nella firma della funzione, è possibile ridurre l'utilizzo a una singola riga, ad es. 'delay (/ * repeat */true, 12000, functionName)'. – BaCaRoZzo

risposta

6

Modificare la proprietà "repeat" su false per l'oggetto 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 spiega la risposta per il tuo codice – Milovidov

7

ho finito di aggiungere questo al mio 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(); 
} 

che può essere utilizzato in questo modo:

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