Qt 根据不同属性对动画进行分组

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

我在QML中有一个通用的
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不过,空中游戏:)