【问题标题】:Grouping animations on different properties对不同属性的动画进行分组
【发布时间】:2023-04-06 03:01:01
【问题描述】:

我在 QML 中有一个通用的 QtObject,我想为它的属性设置动画,并且我想一起启动/停止它们。我写了以下代码,但是 Qt Creator 错误:qrc:/DummyData.qml:11 Cannot assign to non-existent default property

...其中第 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 没有默认属性。当您在 QML 中的可视元素中声明子项时,它们会被添加到 Item 的特殊默认属性中。 QtObject has none. You'll have to be explicit about the instantiation of the child ParallelAnimation` - 将其放入自定义命名属性中。 AFAIK,这个问题与动画无关。最小的测试用例是一个 QtObject,您在其中创建 any QML 子对象:QtObject { QtObject {} }
  • @KubaOber 这听起来很合理。我可以问你为什么评论而不是回答吗?
  • 我通常只有在我有时间运行一些代码以确保我没有写满它时才会回答:) 我最近几个月也没有写过任何 QML,所以我那个地区有点生锈。比抱歉更安全,我讨厌在答案中误导。不过,评论是公平的游戏:)

标签: qt animation qml


【解决方案1】:

只需将其存储在自定义属性中:

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,如果你在某个地方需要它,我会称之为糟糕的设计。

【讨论】:

    猜你喜欢
    • 2019-05-28
    • 2017-11-06
    • 2018-10-24
    • 2017-01-23
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多