Qt 根据不同属性对动画进行分组
我在QML中有一个通用的Qt 根据不同属性对动画进行分组,qt,animation,qml,Qt,Animation,Qml,我在QML中有一个通用的QtObject,我想为它的属性设置动画,我想同时启动/停止它们。我编写了以下代码,但Qt Creator出现错误:qrc:/DummyData.qml:11无法分配给不存在的默认属性 …其中第11行是带有ParallelAnimation{的行 import QtQuick 2.5 QtObject { property real windowFrontLeftOpenPct: 0.0 property real windowFrontRightOpenPc
QtObject
,我想为它的属性设置动画,我想同时启动/停止它们。我编写了以下代码,但Qt Creator出现错误:qrc:/DummyData.qml:11无法分配给不存在的默认属性
…其中第11行是带有ParallelAnimation{
的行
import QtQuick 2.5
QtObject {
property real windowFrontLeftOpenPct: 0.0
property real windowFrontRightOpenPct: 0.0
property real windowRearLeftOpenPct: 0.0
property real windowRearRightOpenPct: 0.0
property bool windowAnimationsActive: false
ParallelAnimation {
running: windowAnimationsActive
SequentialAnimation on windowFrontLeftOpenPct {
loops: Animation.Infinite
NumberAnimation { from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
SequentialAnimation on windowFrontRightOpenPct {
loops: Animation.Infinite
NumberAnimation { from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
SequentialAnimation on windowRearLeftOpenPct {
loops: Animation.Infinite
NumberAnimation { from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
SequentialAnimation on windowRearRightOpenPct {
loops: Animation.Infinite
NumberAnimation { from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
}
}
我不能在单个并行动画中混合不同的目标属性吗
注意:这种情况下的一个解决方法是删除
ParallelAnimation
包装,并将running:windowAnimationsActive
应用到每个SequentialAnimations。但是,我认为这不是一个通用的解决方案,因为它不允许我通过单个父包装轻松暂停和恢复许多动画。只需存储它即可在自定义属性中:
QtObject {
id: windowPositions
property real windowFrontLeftOpenPct: 0.0
property real windowFrontRightOpenPct: 0.0
property real windowRearLeftOpenPct: 0.0
property real windowRearRightOpenPct: 0.0
property bool windowAnimationsActive: false
property ParallelAnimation windowAnimations: ParallelAnimation {
running: windowAnimationsActive
SequentialAnimation {
loops: Animation.Infinite
NumberAnimation { target: windowPositions; property: "windowFrontLeftOpenPct"; from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { target: windowPositions; property: "windowFrontLeftOpenPct"; from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
SequentialAnimation {
loops: Animation.Infinite
NumberAnimation { target: windowPositions; property: "windowFrontRightOpenPct"; from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { target: windowPositions; property: "windowFrontRightOpenPct"; from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
SequentialAnimation {
loops: Animation.Infinite
NumberAnimation { target: windowPositions; property: "windowRearLeftOpenPct"; from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { target: windowPositions; property: "windowRearLeftOpenPct"; from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
SequentialAnimation {
loops: Animation.Infinite
NumberAnimation { target: windowPositions; property: "windowRearRightOpenPct"; from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { target: windowPositions; property: "windowRearRightOpenPct"; from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
}
}
请注意,您不能以这种方式使用“on property”语法。您需要按目标和名称指定。您可以使用properties
通过一个动画更改多个属性:
QtObject {
id: windowPositions
property real windowFrontLeftOpenPct: 0.0
property real windowFrontRightOpenPct: 0.0
property real windowRearLeftOpenPct: 0.0
property real windowRearRightOpenPct: 0.0
property bool running: false
property SequentialAnimation windowAnimations: SequentialAnimation {
running: windowPositions.running
loops: Animation.Infinite
NumberAnimation { target: windowPositions;
properties: "windowFrontLeftOpenPct,windowFrontRightOpenPct,windowRearLeftOpenPct,windowRearRightOpenPct";
from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { target: windowPositions;
properties: "windowFrontLeftOpenPct,windowFrontRightOpenPct,windowRearLeftOpenPct,windowRearRightOpenPct";
from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
}
这只是一个概念,因为为同一个值创建4个相同的属性是无用的,因为在这里创建QtObject是无用的,如果您在某个地方需要它,我会称之为糟糕的设计。只需将其存储在自定义属性中:
QtObject {
id: windowPositions
property real windowFrontLeftOpenPct: 0.0
property real windowFrontRightOpenPct: 0.0
property real windowRearLeftOpenPct: 0.0
property real windowRearRightOpenPct: 0.0
property bool windowAnimationsActive: false
property ParallelAnimation windowAnimations: ParallelAnimation {
running: windowAnimationsActive
SequentialAnimation {
loops: Animation.Infinite
NumberAnimation { target: windowPositions; property: "windowFrontLeftOpenPct"; from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { target: windowPositions; property: "windowFrontLeftOpenPct"; from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
SequentialAnimation {
loops: Animation.Infinite
NumberAnimation { target: windowPositions; property: "windowFrontRightOpenPct"; from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { target: windowPositions; property: "windowFrontRightOpenPct"; from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
SequentialAnimation {
loops: Animation.Infinite
NumberAnimation { target: windowPositions; property: "windowRearLeftOpenPct"; from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { target: windowPositions; property: "windowRearLeftOpenPct"; from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
SequentialAnimation {
loops: Animation.Infinite
NumberAnimation { target: windowPositions; property: "windowRearRightOpenPct"; from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { target: windowPositions; property: "windowRearRightOpenPct"; from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
}
}
请注意,您不能以这种方式使用“on property”语法。您需要按目标和名称指定。您可以使用properties
通过一个动画更改多个属性:
QtObject {
id: windowPositions
property real windowFrontLeftOpenPct: 0.0
property real windowFrontRightOpenPct: 0.0
property real windowRearLeftOpenPct: 0.0
property real windowRearRightOpenPct: 0.0
property bool running: false
property SequentialAnimation windowAnimations: SequentialAnimation {
running: windowPositions.running
loops: Animation.Infinite
NumberAnimation { target: windowPositions;
properties: "windowFrontLeftOpenPct,windowFrontRightOpenPct,windowRearLeftOpenPct,windowRearRightOpenPct";
from:0; to:1; duration:2000; easing.type:Easing.InOutSine }
NumberAnimation { target: windowPositions;
properties: "windowFrontLeftOpenPct,windowFrontRightOpenPct,windowRearLeftOpenPct,windowRearRightOpenPct";
from:1; to:0; duration:2000; easing.type:Easing.InOutSine }
}
}
这只是一个概念,因为为同一个值创建4个相同的属性是无用的,因为在这里创建QtObject是无用的,如果您在某个地方需要它,我会称之为糟糕的设计。QtObject没有默认属性。当您在QML的可视元素中声明子项时,它们会被添加到特殊的默认值中
项的ty
QtObject没有。您必须明确子对象的实例化
ParallelAnimation`-将其放入自定义命名属性中。好了,这个问题与动画无关。最小的测试用例是在QtObject{QtObject>中创建任何QML子对象的QtObject
{} }
@KubaOber这听起来很有道理。我可以问你为什么不回答而发表评论吗?我通常只有在有时间运行一些代码以确保自己没有写满的情况下才会回答:)我最近几个月也没有写过任何QML,所以我在这方面有点生疏。安全总比抱歉好,我讨厌在回答中产生误导。评论是f不过空中游戏:)QtObject没有默认属性。当你在QML中的可视元素中声明子项时,它们会被添加到一个QtObject没有的特殊默认属性中。你必须明确子项的实例化ParallelAnimation`-将它放入一个自定义的命名属性中rty.AFAIK,这个问题与动画无关。最起码的测试用例是一个QtObject
,您可以在其中创建任何QML子对象:QtObject{QtObject{}
@KubaOber这听起来很有道理。我可以问你为什么不回答而发表评论吗?我通常只有在有时间运行一些代码以确保自己没有写满的情况下才会回答:)我最近几个月也没有写过任何QML,所以我在这方面有点生疏。安全总比抱歉好,我讨厌在回答中产生误导。评论是f不过,空中游戏:)