0

問題の自己完結型の例があります。

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最小値を設定する前にスライダーを動かしても、スライダーが正しい初期値になることはありません。

4

2 に答える 2

2

これは のバグではなく、Sliderあなたの使い方です:

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。正しい解決策は、言及していない要件によって異なります。たとえば、1 つの解決策は、Slider代わりに にデフォルト値を指定し、次のようにバインドするvことvalueです。

v: slider ? slider.value : 0

実装順序が不十分に設計されているようです

どのように設計しますか?


Qt Quick Controls 2のSliderを使用してこの回答を更新するには、 moved() シグナルを使用して、ドラッグされているスライダーに応答する必要があります。onValueChangedこの目的で使用すると、通常、問題が発生します。

于 2016-01-23T19:01:43.420 に答える