当C ++中的值发生变化时如何触发动画qml?

时间:2017-01-03 16:34:08

标签: c++ qt qml

我有一个使用C ++和QML的应用程序。

在我的C ++中:我读了 并将其发送到QML以便在滑块中显示。 当我按下硬件时, 会发生变化。

我的问题出在QML部分:

在QML中:

更改时,我需要触发动画几秒钟。当c ++部分的值改变时,我只需要显示这个动画。

如果有人可以提供帮助吗?

我已经尝试过QML计时器但是在值改变时没有显示动画?

动画的QML部分中的一些代码:

VolumeRemote.QML

Rectangle {
id: item1
width: 550
height: 110
color: "#0a0a07"
border.color: "#ffffff"
opacity: 1


SliderComponent{
    id:slider
    x: 34
    y: 79
    width: 466
    height: 5
    minimumValue: 0
   //here i give the value from C++ to my slider
   //Controller is a global Qobject where i define some stuff
    value: Controller.volume_radio
    onValueChanged: {
    animation.running=true;

 }

PropertyAnimation {
                id:myanimation
                running: true                 
                target:item1                
                property: 'visible'
                to: false                      
                duration: 10000 
                }
      }

Text {
    id: text1
    x: 93
    y: 16
    width: 170
    height: 41
    color: "#ffffff"
    text: qsTr("Radio Volume :")
    verticalAlignment: Text.AlignVCenter
    horizontalAlignment: Text.AlignHCenter
    font.pixelSize: 24
    font.family: regular.name
}

Text {
    id: valeurslider
    x: 277
    y: 16
    // x: 618
    //y: 45
    width: 24
    height: 41
    color: "#ffffff"
    text: slider.value
    verticalAlignment: Text.AlignVCenter
    horizontalAlignment: Text.AlignHCenter
    opacity: 0.45
    font.pixelSize: 30
    font.family: regular.name
}

Image {
    id: image1
    x: 34
    y: 16
    width: 44
    height: 41
    source: "assets/ic_sound_popup_on.png"
}

}

3 个答案:

答案 0 :(得分:1)

您有两个选择

本地财产及其变更信号

readonly property qreal valueFromCpp: Controller.volume_radio
onValueFromCppChanged: // trigger animation

一个Connections元素

Connections {
    target: Controller
    onNameOfThePropertyNotifySignal:  // trigger animation
}

答案 1 :(得分:0)

如果你在C ++部分使用它:Q_PROPERTY(int RadioVolume READ getval NOTIFY val_signal),你必须添加一个write函数来改变RadioVolume。 Tha是这样说的: Q_PROPERTY(int RadioVolume READ getval WRITE setVal NOTIFY val_signal)并且在函数setVal()中,您必须更改RadioValume变量值,并且每次值更改时都必须发出val_signal。不是直接设置值,而是每次设置RadioVolume值时调用setVal()函数,然后在QML部分中调用它: onVal_Signal:将动画放在这里 如果您对我的回答有任何疑问,请不要犹豫。如果你有代码,我很乐意帮你改变它

答案 2 :(得分:0)

我使用@Beloqui和@KevinKrammar第二个答案:

1 - 声明属性可见

的简单动画

2 - SliderCompenent并给出值: Controller.volume_radio

3 - 使用连接以获取从C ++通知的信号: OnVolumesignal

然后我可以在从c ++部分

发出信号时触发动画

这里有一小段代码:

import QtQuick 2.0
import QtQuick 2.0
import Controllers 1.0
import "Logic.js" as Controller_Js

   Rectangle {
    id: item1
    width: 550
    height: 110
    color: "#0a0a07"
    border.color: "#ffffff"
   opacity: 1
   visible: Controller.stateVol

SliderComponent{
    id:slider
    x: 34
    y: 79
    width: 466
    height: 5
    minimumValue: 0
    maximumValue: 100
    value: Controller.volume_radio
  NumberAnimation {
    id: animation
    target: item1
    property: "visible"
    duration: 1000
    easing.type: Easing.InOutQuad
}

//gestion du signal
Connections{
    target:commodo
    onVolumesignal:{
        if (commodo.RadioVolume !==100){
            Controller.stateVol=true
            animation.start();
            console.log("state of controller :", Controller.stateVol)
        } else if (commodo.RadioVolume>100){
            animation.stop();
             Controller.stateVol=false
            console.log("state", Controller.stateVol)
        }
      }
  }
controller.qml

中将

Cobntroller.stateVol 定义为false

谢谢大家,这对我很有帮助。