2015-02-13 6 views
13

Vorrei creare una funzione di ritardo in javascript che impiega un parametro di tempo per ritardare, in modo che io possa usarlo per introdurre il ritardo tra l'esecuzione delle linee javascript nella mia applicazione QML. Sarebbe forse simile a questa:Come creare la funzione di ritardo in QML?

function delay(delayTime) { 
// code to create delay 
} 

ho bisogno del corpo della funzione delay(). Notare che setTimeout() di javascript non funziona in QML.

+2

Basta usare un elemento Timer: http://doc.qt.io/qt-5/qtimer.html – MrEricSir

+0

Le scelte sono qui, nei commenti. Oltre a questi, il framework di animazione è piuttosto ricco e offre una varietà di modi per controllare le animazioni. Inserisci i documenti o pubblica una domanda per soddisfare le tue esigenze di animazione. – BaCaRoZzo

+1

Perché i voti negativi? Penso che sia una domanda completamente legittima. –

risposta

22

Come suggerito nei commenti alla tua domanda, il componente Timer è una buona soluzione a questo.

function Timer() { 
    return Qt.createQmlObject("import QtQuick 2.0; Timer {}", root); 
} 

timer = new Timer(); 
timer.interval = 1000; 
timer.repeat = true; 
timer.triggered.connect(function() { 
    print("I'm triggered once every second"); 
}) 

timer.start(); 

Quanto sopra sarebbe come sto attualmente utilizzandolo, ed ecco come avrei potuto implementare l'esempio nella tua domanda.

function delay(delayTime) { 
    timer = new Timer(); 
    timer.interval = delayTime; 
    timer.repeat = false; 
    timer.start(); 
} 

(che non fa nulla, continua a leggere)

Anche se il modo in cui esatta che stai cercando per la sua attuazione suggerisce che si sta cercando per la sua blocco fino alla prossima linea di il tuo programma viene eseguito Ma questo non è un ottimo modo per farlo, poiché bloccherebbe anche lo nel tuo programma come JavaScript viene eseguito solo in un singolo thread di esecuzione.

Un'alternativa è passare una richiamata.

function delay(delayTime, cb) { 
    timer = new Timer(); 
    timer.interval = delayTime; 
    timer.repeat = false; 
    timer.triggered.connect(cb); 
    timer.start(); 
} 

Quale consentirebbe di utilizzarlo come tale.

delay(1000, function() { 
    print("I am called one second after I was started."); 
}); 

Spero che sia d'aiuto!

Modifica: Quanto sopra presuppone che si stia lavorando in un file JavaScript separato che verrà successivamente importato nel file QML. Per fare direttamente l'equivalente in un file QML, puoi farlo.

import QtQuick 2.0 

Rectangle { 
    width: 800 
    height: 600 

    color: "brown" 

    Timer { 
     id: timer 
    } 

    function delay(delayTime, cb) { 
     timer.interval = delayTime; 
     timer.repeat = false; 
     timer.triggered.connect(cb); 
     timer.start(); 
    } 

    Rectangle { 
     id: rectangle 
     color: "yellow" 
     anchors.fill: parent 
     anchors.margins: 100 
     opacity: 0 

     Behavior on opacity { 
      NumberAnimation { 
       duration: 500 
      } 
     } 
    } 

    Component.onCompleted: { 
     print("I'm printed right away..") 
     delay(1000, function() { 
      print("And I'm printed after 1 second!") 
      rectangle.opacity = 1 
     }) 
    } 
} 

Non sono convinto che questa sia la soluzione al problema attuale; per ritardare un'animazione, è possibile utilizzare PauseAnimation.

+0

A anche pensare che 'Timer' sia una buona soluzione – folibis

1

è possibile utilizzare QtTest

import QtTest 1.0 
import QtQuick 2.9 

ApplicationWindow{ 
    id: window 

    TestEvent { 
     id: test 
    } 

    function delay_ms(delay_time) { 
     test.mouseClick(window, 0, 0, Qt.NoButton, Qt.NoModifier, delay_time) 
    } 
}