更新 NumberAnimation 中的字段

Updating a field in NumberAnimation

Item {
    id: valueSource
    objectName: "valueSource"
    property real myvariable: 0
    property real abc: 0
    property real xyz: 0
    SequentialAnimation {
        running: true
        loops: 1

        PauseAnimation {
            duration: 1000
        }

        PropertyAction {
            target: valueSource
            property: "start"
            value: false
        }

        SequentialAnimation {
            loops: Animation.Infinite

            ParallelAnimation {
                NumberAnimation {
                    target: valueSource
                    property: "abc"
                    easing.type: Easing.InOutSine
                    from: a //0
                    to: b //100
                    duration: 3000
                }
                NumberAnimation {
                    target: valueSource
                    property: "xyz"
                    easing.type: Easing.InOutSine
                    from: c //1
                    to: d //50
                    duration: 3000
                }
            }
        }
}

我是第一次使用qt和cpp。所以请帮助我,即使这是一个愚蠢的问题。 我可以使用 findChild("valueSource") 从 C++ 代码更新 abc 和 xyz 的值,但我想在 NumberAnimation 中更新 'from' 和 'to' 的值。 1) 我尝试在 NumberAnimation 中添加一个字段 objectName,然后在 cpp 代码中使用这个对象,就像我用来更新 abc 和 xyz 但无法修改 from 和 to 的值一样。 2) 还尝试使用 a、b、c、d 变量。 a、b、c、d 的值正在从 cpp 代码更新并反映在 qml 中,但它没有更新 to 和 from 的值。

还有其他方法吗?

在c++和qml之间通信的最佳方式是使用信号槽模型。不要使用 findChild()。我建议您执行以下步骤:

  1. 在你的 C++ 中声明一个信号并将它连接到一个插槽,这实际上是你的 qml rootObject 的一个 javascript 函数。

  2. 在此插槽内(在我的示例中为setObjectProperty)使用类似

    的东西

    函数 setObjectProperty() { yourObjectId.setProperty(真); }

其中 yourObjectId 是您要操作的 Itemid

  1. 在你的 Item 中声明一个 setProperty 函数(正如我命名的,当然你可以选择任何你喜欢的名字 =)))

    函数 setPoperty ( val ) { internalObjectId.someProperty = 值; }

这应该行得通。如果还有任何问题 - 让我知道,我可以为您提供一些代码。

感谢您的回复,但我找到了解决方案。

其实我是想通过修改to和from的值实现一个针的平滑过渡,因为我直接更新abc的时候并没有平滑过渡。

但是使用下面的方法我得到了平滑的针过渡。

从 cpp 代码更新 abc 值并在您的 qml 文件中添加以下代码。

    Behavior on kph{
        NumberAnimation{duration: 2000}
    }