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