2015-11-19 22 views
6

Ho diversi stati che uso solo modificare alcune proprietà:QML eseguire JavaScript codice dopo il cambiamento di stato

Item { 
    id: props 
    property int someProperty: 0 
    // ... 

    states: [ 
     State { 
      name: "firstState" 
      PropertyChange { 
       target: props 
       someProperty: 1 
       // ... 
      } 
     }, 
     State { 
      name: "secondState" 
      PropertyChange { 
       target: props 
       someProperty: 1 
       // ... 
      } 
     } 
    ] 
    onStateChange: doSomething(someProperty) 
} 

Da diversi stati potrebbero avere lo stesso valore per someProperty Non posso contare sul segnale somePropertyChange, ma non posso nemmeno contare sullo onStateChange (come nell'esempio) dal momento che quando viene eseguito, le proprietà sono invariate.

Quindi, come posso eseguire doSomething() ogni volta che lo stato cambia? C'è un modo migliore per fare questo genere di cose con QML?

+0

Dove si esegue il comando che uno stato dovrebbe cambiare? Qui puoi anche eseguire il tuo metodo "doSomething()". Inoltre è possibile utilizzare i collegamenti di proprietà per modificare le proprietà: questo è il modo migliore. QML è un linguaggio dichiarativo! – sk2212

+0

@ sk2212 Eseguo il comando per il cambio di stato in più parti attraverso l'applicazione, quindi mettere 'doSomething()' dappertutto non suona come una buona scelta (ma potrei creare una funzione che cambia stato ed eseguire 'doSomething()' di cambiare il valore di stato). Nell'applicazione reale 'someProperty' è il numero di secondi dopo il quale deve essere attivato un evento, se lo stato cambia il timer dovrebbe iniziare dall'inizio (se due stati hanno lo stesso numero di secondi il segnale' somePropertyChange' non viene attivato in tal modo il timer non si riavvia utilizzando un legame di proprietà). – lambdauser

+0

Bene ... come si cambia lo stato attraverso l'applicazione? Fare riferimento all'ID in altri file qml? Forse dovresti anche dare un'occhiata alla proprietà 'running' dal componente' Timer'. – sk2212

risposta

6

È possibile eseguire alcuni script utilizzando StateChangeScript.

Item { 
    id: props 
    property int someProperty: 0 

    states: [ 
     State { 
      name: "firstState" 
      PropertyChanges { 
       target: props 
       someProperty: 1 
      } 
      StateChangeScript { 
       name: "firstScript" 
       script: console.log("entering first state") 
      } 
     }, 
     State { 
      name: "secondState" 
      PropertyChanges { 
       target: props 
       someProperty: 1 
      } 
      StateChangeScript { 
       name: "secondScript" 
       script: console.log("entering second state") 
      } 
     } 
    ] 
} 
+0

ma con questa soluzione ho bisogno di inserire un StateChangeScript all'interno di ogni stato – lambdauser

1
Item { 
    id: props 
    property int someProperty: 0 
    // ... 

    states: [ 
     State { 
      name: "firstState" 
      PropertyChange { 
       target: props 
       someProperty: 1 
       // ... 
      } 
     }, 
     State { 
      name: "secondState" 
      PropertyChange { 
       target: props 
       someProperty: 1 
       // ... 
      } 
     } 
    ] 

    transitions: [ 
     Transition { 
      ScriptAction { 
       script: console.log("transition to " + props.state) 
      } 
     } 
    ] 
}