2017-08-23 3 views
0

Je veux changer une propriété ou exécuter des scripts quand un état particulier se termine.Faire quelque chose quand l'état est remplacé

En mode formel, j'utiliserai une variable pour sauvegarder l'état précédent. Lorsque l'état change, vérifiez l'état précédent et déterminez si les scripts doivent être exécutés. Mais le code sera plus redondant lorsque le nombre d'états augmentera. Comment puis-je simplifier cela?

par exemple. Comment simplifier le code suivant?

Item { 
    property var work 
    property var preState 
    states: [ 
     State { 
      name: "state1"; 
      ... 
     }, 
     State { 
      name: "state2"; 
      ... 
     } 
     ... 
     State { 
      name: "stateN"; 
      ... 
     } 
    ] 
    onStateChanged: { 
     if (preState == "state1") { 
      ... 
     } else if (preState == "state2") { 
      ... 
     } else if (preState == "stateN") { 
      ... 
     } 
    } 
    ... 
} 

Répondre

0

Vous pouvez utiliser le signal onStateChanged pour que

Item { 
    id:stateTest 
    property var work 
    property var prevState 
    states: [ 
     State { 
      name: "state1"; 

     }, 
     State { 
      name: "state2"; 

     }, 

     State { 
      name: "stateN"; 

     } 
    ] 

    onStateChanged: { 

     work="whatever" 

     prevState=state 
    } 

    Component.onCompleted: prevState=state 
} 
1

Si vous voulez l'utiliser comme déclarative que possible, vous évitez d'utiliser des scripts sur un changement d'état. Au lieu de cela vous déclarez, ce qui doit changer quand un nouveau State est entré. Pour cela, vous pouvez fournir une liste d'éléments PropertyChanges. Vous pouvez également modifier anchors et le parent parent avec Changes spécialisé. Si vous devez exécuter un script, le bon moyen est d'utiliser un élément StateChangeScript. Pour animer les modifications, ajoutez Transition s.

Here vous pouvez trouver plus d'informations sur l'utilisation du State s

La syntaxe est assez facile:

State { 
    name: 'myState1' 
    PropertyChanges { target: root; color: 'green' } 
    AnchorChanges { target: child; anchors.top: root.bottom } 
    // ... some more if necessary ... 
} 

La bonne chose sur l'utilisation du Changes est que le résultat est automatiquement une liaison de , plutôt que d'une affectation ce que ce serait, si vous le définir dans un script. (sans Qt.binding(...))