2012-11-30 61 views
2

我有一個int propertySliderButton QML文檔。我想要x始終與Slider.value具有相同的值。這裏是我的QML:爲什麼我的QML屬性更新時,它綁定到Slider.value屬性?

Page { 
    property int x: 1 

    content: Container { 
     Slider { 
      fromValue: 1 
      toValue: 500 
      value: x 
      onValueChanged: { 
       console.log("Slider value is: "+value); 
       console.log("x value: "+x); 
      } 
     } 
     Button { 
      text: "Increment x" 
      onClicked: { 
       x=x+10; 
      } 
     } 
    } 
} 

當我按下滑塊值被更新,x被更新的按鈕。但是當我移動滑塊時,x的值不會更新。爲什麼移動滑塊時x的值不會變化?

回答

4

因爲您的x未綁定到Slider.value。當你綁定Slider.valuex,如果x更改,Slider.value也將更改BUT如果Slider.value更改(當您滑動它時),x值將不會更改。

爲了解決這個問題,你可以使用alias

property alias x: slider.value // assume the Slider has a id of "slider" 
+0

非常感謝。這不太理想,因爲我實際上想要一個「int」類型的屬性,而不是類型「real」,這就是'slider.value'的意思。但解決問題相當容易。 – donturner

+0

@donturner:你想實現什麼目標?如果您想在按下按鈕時更改該值(如上面的示例),只需直接更改「Slider.value」。別名類型主要用於將兒童的財產暴露於頂層。 – Dickson

+0

我想用滑塊來控制動畫的速度,爲此我需要一個整數值來指定動畫的持續時間(以毫秒爲單位)。我現在可以通過引用別名並將其轉換爲int來在Javascript中執行此操作。 – donturner

2

試試這個:

Page { 
property int x: **sliderID.value** 

content: Container { 
    Slider { 
     **id: sliderID** 
     fromValue: 1 
     toValue: 500 
     value: x 
     onValueChanged: { 
      console.log("Slider value is: "+value); 
      console.log("x value: "+x); 
     } 
    } 
    Button { 
     text: "Increment x" 
     onClicked: { 
      x=x+10; 
     } 
    } 
} 

}

我建立了一個雙向綁定。

+0

不幸的是在測試4我得到的錯誤:'main.qml:4:1: QML bb :: cascades :: QmlPage_QML_0:爲屬性「x」檢測到綁定循環 – donturner

+0

並且在移動滑塊時不會更新'x'的值 – donturner

1

使用onImmediateValueChanged信號,而不是onValueChanged

... 
onImmediateValueChanged: { 
    console.log("Slider value is: "+value); 
    console.log("x value: "+x); 
} 
... 
+0

當使用此方法時,它在更改滑塊時工作正常,但當單擊該按鈕時(我仍然收到「檢測到綁定循環」消息)時,會得到'value'和'x'的不同值。 – donturner