我正在尝试实施一个健身应用程序,显示当前的锻炼名称,然后在休息期间显示进度条。当进度条完全填满时,将显示下一个练习的名称,然后在完成时显示进度条,依此类推。
请注意,我在此示例中使用了一个进度条,但我将在实际应用程序中使用自己的小部件。
我的系统有两种状态:
所以它是这样的:
我的问题在于第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()
}
}
如何在状态转换结束时切换到另一个状态?
答案 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