Qt Quick编写的Rectangle动画运行异常相关问题求助
问题1解答
你当前用State的when条件绑定mouseArea.pressed实现宽度累加的逻辑有本质问题:
- State的切换仅在
when对应的布尔值发生变化时触发1次,也就是只有「按下鼠标」和「松开鼠标」两个时间点会触发状态切换,按住鼠标不动的过程中不会反复触发状态切换。 - PropertyChanges里的
rect.width + 100是状态切换的瞬间计算取值,仅计算1次,不会在按住过程中重复计算,自然无法实现每次加100的效果。
如果要实现按住鼠标持续累加宽度,建议放弃用State实现,改为监听MouseArea的pressAndHold信号,配合Timer定时器,按住期间每隔固定间隔修改一次宽度即可。
问题2解答
这是因为你没有给NumberAnimation明确指定作用的目标和属性:
- 你当前写的通用
NumberAnimation没有指定target和property参数,QtQuick的动画匹配逻辑无法准确将它和width的属性变化绑定,优先直接应用了PropertyChanges里的固定值,就出现了宽度瞬间变化的情况。
修改方法很简单,给NumberAnimation明确指定作用对象即可:
NumberAnimation { target: rect; property: "width"; duration: 1000 }
问题3解答
有两个原因共同导致旋转角度不符合预期:
- 你固定写了目标旋转值
rotation: 720,而不是在当前旋转值的基础上累加720,第一次按下从0转到720,松开回到默认状态(rotation为0)时,因为你的Transition没有指定to:限制,默认是双向生效的,返回默认状态也会走旋转动画,相当于每次按下+松开就会转4圈,反复快速点击的话动画未结束就触发下一次切换,就会出现总旋转角度超过720的情况。 RotationAnimation默认的direction属性值是RotationAnimation.Shortest,会自动选择最短路径旋转,当起始值和目标值差值为360的整数倍时,旋转方向和圈数计算会不符合预期。
解决方法:
- 把PropertyChanges里的旋转值改为累加:
rotation: rect.rotation + 720 - 给RotationAnimation指定顺时针旋转:
RotationAnimation { duration: 1000; direction: RotationAnimation.Clockwise } - 如果只需要按下的时候触发旋转动画,给Transition加上
to: "A"限制,让它仅在进入A状态时生效,松开返回默认状态不触发动画。
内容的提问来源于stack exchange,提问作者jett chen
相关产品推荐
相关产品推荐

