更新NumberAnimation中的字段

时间:2015-12-01 09:11:10

标签: qml qtquick2 qt5.5

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的值。

我还有其他办法吗?

2 个答案:

答案 0 :(得分:1)

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

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

  2. 在此广告位中(我的示例中为setObjectProperty)使用类似

    的内容

    function setObjectProperty() { yourObjectId.setProperty(true); }

  3. 其中yourObjectId是您想要操作的id的{​​{1}}

    1. 在你的Item中声明一个Item函数(因为我命名它,你可以选择你喜欢的任何名称=)))

      function setPoperty(val) { internalObjectId.someProperty = val; }

    2. 这应该有效。如果有任何问题 - 让我知道,我可以为你提供一些代码。

答案 1 :(得分:0)

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

实际上,通过修改to和from值我想实现针的平滑过渡,因为当我直接更新abc时,我没有得到平滑过渡。

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

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



    Behavior on kph{
        NumberAnimation{duration: 2000}
    }