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

Qt 如何在QML转换结束时切换到另一个状态?,qt,qml,Qt,Qml,我正在尝试实现一个健身应用程序,它显示当前的运动名称,然后在休息期间显示一个进度条。进度条完全填充后,将显示下一个练习的名称,完成后将显示进度条,依此类推 注意,我在这个示例中使用了一个进度条,但在实际应用程序中我将有自己的小部件 我的系统有两种状态: 练习进度条的值为0并保持为0 休息在休息期间,进度条的值从0变为最大值 所以它是这样的: 应用程序处于“exercise”状态,并显示当前exercise的名称 用户执行练习,完成后单击进度条 应用程序将切换到“rest”状态 用户在完成进度

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

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

我的系统有两种状态:

  • 练习进度条的值为0并保持为0
  • 休息在休息期间,进度条的值从0变为最大值
所以它是这样的:

  • 应用程序处于“exercise”状态,并显示当前exercise的名称
  • 用户执行练习,完成后单击进度条
  • 应用程序将切换到“rest”状态
  • 用户在完成进度条时休息
  • 进度条完成后,应用程序将切换回“练习”状态,并显示下一个练习的名称
  • 我的问题在于步骤5:我不知道如何在转换结束时切换回另一个状态。我尝试在PropertyChanges期间更改“state”属性,并在转换结束时使用SequentialAnimation计时,但我收到以下错误消息:

    QML状态组:无法将状态更改作为状态定义的一部分应用

    以下是一些示例代码:

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

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

    我相信您可以通过使用转换的RunningChanged信号来实现这一点:

    transitions: [
        Transition {
            to: "rest"
            PropertyAnimation {
                target: root
                properties: "value"
                duration: 1000
            }
    
            onRunningChanged: {
                if ((state == "rest") && (!running))
                    switchState();
            }
        }
    ]
    

    QML对象具有用于属性更改的关联信号(
    onChanged
    )。关联的处理程序通常不会记录在对象的引用中,但由于属性的存在,它们是隐式可用的。请参阅。

    更新
    我提出了一个错误的解决方案,因为这是一个错误,请原谅。
    修复它的问题会得到与@Gabrief one相同的解决方案。所以我删除了它以避免重复

    不过,下面的解决方案非常有效,可以在过渡/动画中为您提供良好的控制

    也是另一种方式

    transitions: [
        Transition {
            to: "rest"
            SequentialAnimation {
                PropertyAnimation {
                    target: root
                    properties: "value"
                    duration: 1000
                }
                ScriptAction { script: {switchState();} }    //<----
            }
        }
    ]    
    
    转换:[
    过渡{
    致:“休息”
    顺序动画{
    物业估价{
    目标:根
    属性:“值”
    持续时间:1000
    }
    
    ScriptAction{script:{switchState();}}}//一个选项是在末尾触发一个计时器,并从计时器开始改变状态。根据“它仅为顶级独立动画触发。对于行为或转换中的动画,或动画组中的动画,不会触发它。”所以你的第一个和第二个例子不起作用,我想。我真的很喜欢你最后一个例子中的方法,我现在在我的应用程序中使用它,效果很好。我更喜欢使用
    SequentialAnimation{…ScriptAction{script:…}的解决方案
    但是第二个
    PropertyAnimation
    是误导性的,与OP的问题无关,因此我还不能投票。注意:
    switchState()
    周围的花括号是不必要的。