2014-04-07 15 views
7

Ich versuche eine Fitness-Anwendung zu implementieren, die den aktuellen Übungsnamen anzeigt und dann während der Ruhephasen einen Fortschrittsbalken anzeigt. Wenn der Fortschrittsbalken vollständig ausgefüllt ist, wird der Name der nächsten Übung angezeigt, dann wird eine Fortschrittsleiste angezeigt, wenn sie abgeschlossen ist, und so weiter.Wie wird am Ende eines Übergangs in QML in einen anderen Status gewechselt?

Beachten Sie, dass ich eine Fortschrittsanzeige für dieses Beispiel verwende, aber ich habe mein eigenes Widget in der realen Anwendung.

Mein System hat zwei Zustände:

  • Übung der Wert des Fortschrittsbalkens 0 ist und bleibt 0
  • Rest der Wert des Fortschrittsbalkens geht von 0 bis Maximalwert über die Dauer der Ruhezeit

So geht es wie folgt aus:

  1. die Anwendung in „Übung“ Zustand und zeigt den Namen des aktuellen exercicse
  2. der Benutzer die Übung ausführen und auf dem Fortschrittsbalken klicken, wenn er
  3. getan Zustand
  4. die Anwendung schaltet auf den „Rest“
  5. der Benutzer ruht, während die Fortschrittsbalken
  6. nach den Fortschrittsbalken abgeschlossen sind, um die Anwendung beendet ist schaltet zurück auf den „Übung“ Zustand und zeigt den Namen der nächsten Übung

Mein Problem ist, Witz h Schritt 5: Ich weiß nicht, wie ich am Ende eines Übergangs in einen anderen Zustand zurückwechseln kann. Ich habe versucht, die „Zustand“ Eigenschaft während eines Property und Zeit es am Ende eines Übergangs mit einem SequentialAnimation zu ändern, aber ich bekomme diese Fehlermeldung:

QML StateGroup: Kann nicht eine Zustandsänderung beantragen als Teil einer Zustandsdefinition.

Hier ist ein Beispielcode:

import QtQuick 2.0 
import QtQuick.Controls 1.1 

ProgressBar { 
    id: root 

    width: 200 
    height: 48 

    minimumValue: 0 
    maximumValue: 100 
    value: 76 

    function switchState() { 
     if (state == "exercise") 
     { 
      state = "rest" 
      return 
     } 

     if (state == "rest") 
     { 
      state = "exercise" 
      return 
     } 
    } 

    state: "exercise" 

    states: [ 
     State { 
      name: "exercise" 
      PropertyChanges { 
       target: root 
       value: 0 
      } 
     }, 
     State { 
      name: "rest" 
      PropertyChanges { 
       target: root 
       value: maximumValue 

       // error: QML StateGroup: Can't apply a state change as part of a state definition. 
       // state: "exercise" 
      } 
     } 
    ] 

    transitions: [ 
     Transition { 
      to: "rest" 
      PropertyAnimation { 
       target: root 
       properties: "value" 
       duration: 1000 
      } 
     } 
    ] 

    MouseArea { 
     anchors.fill: parent 
     onClicked: parent.switchState() 
    } 
} 

Wie kann ich am Ende eines Zustandsübergang in einen anderen Zustand wechseln?

+0

Eine Möglichkeit wäre, einen Timer am Ende auszulösen und die Zustandsänderung vom Zeitgeberablaufstatusbit zu tun. – onion

Antwort

5

Ich glaube, Sie können dies tun, indem Sie das RunningChanged Signal von dem Übergang mit:

transitions: [ 
    Transition { 
     to: "rest" 
     PropertyAnimation { 
      target: root 
      properties: "value" 
      duration: 1000 
     } 

     onRunningChanged: { 
      if ((state == "rest") && (!running)) 
       switchState(); 
     } 
    } 
] 

QML Objekte haben ein zugehöriges Signal für Eigenschaftsänderungen (on<Property>Changed). Die zugeordneten Handler sind normalerweise nicht in den Referenzen der Objekte dokumentiert, aber aufgrund der Existenz der Eigenschaft implizit verfügbar. Siehe this.

+0

Funktioniert perfekt, vielen Dank. – Charles

1

UPDATE
ich eine falsche Lösung, weil ein Fehler vorgeschlagen, mich so entschuldigen Sie bitte.
Das Beheben seines Problems führt zur gleichen Lösung wie @GabrielF. Also habe ich es gelöscht, um Wiederholungen zu vermeiden.

Allerdings funktioniert die Lösung unten gut und gibt Ihnen eine gute Kontrolle innerhalb einer Transition/Animaiton.

Auch ein anderer Weg!

transitions: [ 
    Transition { 
     to: "rest" 
     SequentialAnimation { 
      PropertyAnimation { 
       target: root 
       properties: "value" 
       duration: 1000 
      } 
      ScriptAction { script: {switchState();} } //<---- 
     } 
    } 
]  

Bitte beachten Sie, dass mit SequentialAnimation innerhalb einer Übergangsanimation, brauchen Sie nicht einen mittleren Zustand zu definieren, wenn Sie nur mögen, um sicherzustellen, dass eine bestimmte Animation abgeschlossen ist.

Goodluck - S.M.Mousavi

+0

Laut der [Doku auf dem 'stopped' Signal] (http://doc.qt.io/qt-5/qml-qtquick-animation.html#stopped-signal)," Es wird nur für die oberste Ebene ausgelöst , Standalone-Animationen. Es wird nicht für Animationen in einem Behavior oder Transition oder Animationen, die Teil einer Animationsgruppe sind, ausgelöst. " Dein erstes und zweites Beispiel würde nicht funktionieren, denke ich. –

+0

Ich mag den Ansatz in Ihrem letzten Beispiel, ich benutze es jetzt in meiner App und es funktioniert großartig. –

+0

Sie Recht @Stefan Monov Die Antwort aktualisiert. –

Verwandte Themen