QML: attendre jusqu'à ce que les animations fini
Je suis en train d'essayer de rendre visible des animations séquentielle. J'ai une fonction javascript, qui appellent monmodèle.move() deux fois. J'ai un GridView pour montrer monmodèle et j'ai "Comportement sur x" de l'animation, donc je peux voir visuellement les mouvements. Mais, à la fois mouvement animatons s'exécute en parallèle (le petit retard entre eux n'est pas perceptible).
Mon idée était d'ajouter un compteur de nombre d'animations a été commencé et combien d'entre eux déjà fini. Quelque chose comme ceci;
Behavior on x {
NumberAnimation {
id: animationX;
duration: 500;
onRunningChanged: {
if (animationX.running) {
console.log("Animation start");
myModel.busy = myModel.busy + 1
} else {
console.log("Animation stop");
myModel.busy = myModel.busy - 1
}
}
}
}
Cela fonctionne comme prévu. Ensuite, j'ajoute une boucle de ma fonction javascript à attendre jusqu'à ce que toutes les animations fini.
ListModel {
id: myModel
property int busy: 0
function doSomething() {
myModel.move(...)
while (myModel.busy) {}
myModel.move(...)
}
}
Là est le problème. Je peux voir que, après le premier move() toutes les animations ont commencé, mais rien ne peut être vu et aucun de l'animation terminée. J'ai une sorte de blocage. Comment résoudre ce problème?
OriginalL'auteur meolic | 2012-09-07
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas bon avec javascript. Mais pourquoi avez-vous occupé en boucle? Je voudrais créer 2 fonctions.
myModel.move()
, puis préparer le terrain pour un événement à venir (comme la création d'un bouton caché qui sera cliqué)Onclick
.Il semble que
onRunningChanged
est une définition de gestionnaire d'événements. Pourquoi ne pas créer la même , permet de l'appeleronModelIdle
commeUne longue boucle n'est pas une bonne idée si vous voulez maintenir la performance.
et où voyez-vous je dis que c'est une bonne idée?
Nulle part, donc ajouté pour l'avenir stumblers. :} Je pourrais ajouter que dans les navigateurs, vous pouvez créer graphiquement performant boucles à l'aide de requestAnimationFrame. Qt Quick a également une version équivalente de la fonction qui, lorsqu'utilisé à bon escient pour créer des boucles conduira à de meilleures performances graphiques des animations: doc.qt.io/qt-5/... Une longue boucle dans un non-graphique thread est parfaitement bien pour croquer des nombres aussi vite que possible (plutôt que de limiter la boucle de 16ms tiques comme vous le faites avec requestAnimationFrame). Donc, cela dépend du cas d'utilisation. 🙂
OriginalL'auteur UmNyobe
Ici est une solution de travail basé sur la réponse de #UmNyobe. Eh bien, QML est un langage déclaratif et donc problématique pour itératif problèmes. Tous les commentaires sont les bienvenus. Peut-être, quelqu'un peut proposer la meilleure (plus lisible) pur QML programme qui permettra de produire le même effet.
OriginalL'auteur meolic