2016-01-23 59 views
-1

有一個問題的自包含例如:滑塊元件保持目標值復位爲滑塊的最小值

Rectangle { 
    id: rect 
    width: 200 
    height: 200 
    property real v : 50 
    onVChanged: console.log(v) 
    Button { 
     onClicked: scomp.createObject(rect) 
    } 
    Component { 
     id: scomp 
     Rectangle { 
      id: sli 
      anchors.fill: parent 
      Column { 
       Slider { 
        width: 200 
        minimumValue: 10 
        maximumValue: 100 
        value: rect.v 
        onValueChanged: rect.v = value 
       } 
       Button { 
        onClicked: sli.destroy() 
       } 
      } 
     } 
    } 
} 

基本上,每個時間滑塊組件被創建修改v它它設置於滑塊的最小值。請注意,滑塊仍能正確工作以修改該值,並且在滑塊關閉後v將保持其適當的值,但在再次打開該滑塊時,該值再次損壞。

爲什麼會發生這種情況,如何預防呢?似乎由於某些可解釋的原因,滑塊的value屬性暫時假定其值爲minimumValue,但這看起來不夠恰當。也許是一個錯誤?即使在設置最小值之前移動了value: rect.v,滑塊也不會真正採用正確的初始值。

回答

-1

沒有在Slider元素的實現中挖掘,看起來實現順序設計得很差,初始值爲0.0,因此將最小值設置爲任何更高的值都會提高值。由於評估的順序,值是否高於最小值並不重要,因此在設置最小值時,值始終爲0.0,因此在此格式下,目標值將始終損壞滑塊的最小值。

我提出的解決方案通過延遲目標值綁定來避免這種行爲,它的工作原理,但它並不漂亮,所以我仍然對其他解決方案開放,同時Qt的人 - 如果你看到這個,你可能會想修復Slider

Slider { 
    width: 200 
    minimumValue: 10 
    maximumValue: 100 
    value: rect.v 
    Component.onCompleted: valueChanged.connect(function(){ rect.v = value}) 
} 

這種格式仍然最初推動滑塊值的最小值,但此時設定目標值的結合還不存在,它只是創造了滑塊值假設後正確的價值。

+0

根本不應該依賴'valueChanged',因爲每次更改值時都會調用所有其他處理程序,甚至是初始分配。糟糕的設計選擇?你可以爭論,但目前它是如何工作的。而是將該值綁定到滑塊值:該值使用滑塊進行更新。類似[this](http://pastebin.com/raw/62cXrMqz)。 – BaCaRoZzo

+0

@BaCaRoZzo你的代碼是荒謬的,很明顯滑塊在調整後被破壞,將目標值綁定到滑塊值是對問題最糟糕的可能「解決方案」,實際上甚至沒有解決方案。如果滑塊已正確實現,則將滑塊值設置爲目標值將不會循環回目標值,因爲該值相同。滑塊中存在寄生值變化,是的,寄生非預期行爲是不好的設計。正是這種糟糕的設計阻止了組件以最清潔和最合乎邏輯的方式被使用。 – IvanB

+0

不考慮功能,你的解決方案實際上建議將數據綁定到UI,這本身就是非常糟糕的設計。 UI綁定到數據,數據不應該依賴於UI。 UI隨需而變,可視化或與數據交互。 – IvanB

1

它不是Slider一個bug,這是你的這用法:

onValueChanged: rect.v = value 

如果你添加一些調試語句:

qml: maximumValue = 100 value = 0 
qml: minimumValue = 10 value = 10 
qml: value = 10 
qml: v = 10 
void __cdecl QQuickRangeModel::setValue(double) 10 
qml: in Component.onCompleted of Slider: value = 10 minimumValue = 10 maximumValue = 100 

之前,它甚至得到一個機會來完成加載,你已經將其value分配給v。正確的解決方案取決於你的要求,你沒有提到。例如,一種解決方案是指定的Slider而不是默認值,並結合vvalue

v: slider ? slider.value : 0 

似乎執行訂單已設計不當

How would you design it

+0

這不是一個有用的使用格式。它可能在一個很小的孤立例子中工作,但在生產中不可能這樣做。 minimumValue修改值聽起來像是一個糟糕的設計決定。這意味着用戶使用滑塊來指定一個值,但是沒有任何用戶交互。 – IvanB

+1

更好的解決方案是先設置值,如果值超出範圍,則值本身可以推送最小值和最大值,這樣做更合適 - 適用於使用場景的滑塊而不是生成虛假值更改。 – IvanB

+0

是的,將數據綁定到UI元素當然不是最好的想法。而QtQuick控件遠非完美,它們只是QtWidgets的一個微弱陰影,仍然不成熟,在功能方面遠遠落後。控件只適用於基本的應用程序,我已經嘗試在生產中使用它們,並最終實現了我嘗試使用的幾乎所有元素的組件。在不同的平臺上設計問題,行爲問題,IMO這些都是誘惑QtWidgets用戶採用QML的誘餌。不值得頭痛,只是做你自己的滑塊。 – dtech