如何在QML转换结束时切换到另一个状态?

时间:2014-04-07 02:43:22

标签: qt qml

我正在尝试实施一个健身应用程序,显示当前的锻炼名称,然后在休息期间显示进度条。当进度条完全填满时,将显示下一个练习的名称,然后在完成时显示进度条,依此类推。

请注意,我在此示例中使用了一个进度条,但我将在实际应用程序中使用自己的小部件。

我的系统有两种状态:

  • 练习进度条的值为0并保持为0
  • 休息进度条的值在休息期间从0变为maximumValue

所以它是这样的:

  1. 应用程序处于“运动”状态并显示当前练习的名称
  2. 用户执行练习并在完成后点击进度条
  3. 应用程序切换到“休息”状态
  4. 用户在进度条完成时休息
  5. 进度条完成后,应用程序切换回“运动”状态并显示下一个练习的名称
  6. 我的问题在于第5步:我不知道如何在转换结束时切换回另一个状态。我试图在PropertyChanges期间更改“state”属性,并在使用SequentialAnimation的转换结束时计时,但是我收到此错误消息:

      

    QML StateGroup:不能将状态更改作为状态定义的一部分应用。

    以下是一些示例代码:

    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()
        }
    }
    

    如何在状态转换结束时切换到另一个状态?

2 个答案:

答案 0 :(得分:6)

我相信您可以通过使用转换中的RunningChanged信号来实现此目的:

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

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

QML对象具有属性更改的关联信号(on<Property>Changed)。相关的处理程序通常没有记录在对象中。引用,但由于属性的存在而隐含可用。请参阅this

答案 1 :(得分:2)

<强>更新
我提出了一个错误的解决方案,因为一个错误,请原谅我 解决问题的结果与@GabrielF相同。所以我删除它以避免重复。

但是,以下解决方案效果很好,可以在过渡/动画中为您提供良好的控制。

另一种方式!

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

请注意,如果您希望确保特定动画完成,则在转换动画中使用SequentialAnimation时,无需定义中间状态。

Goodluck - S.M.Mousavi