如何在 qml 中设置自定义滑块的初始值?

How to set initial value of a custom slider in qml?

我正在使用 Qt 5.4.1。我制作了一个自定义滑块元素以用于其他 qml 组件,如下所示:

Slider.qml
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Controls.Styles 1.3

Item {
    id: root
    width: 150
    height: 30

    property int val: slider.value
    property int maxVal: slider.maximumValue
    property int minVal: slider.minimumValue
    property int step: slider.stepSize

    Slider {
        id: slider
        anchors.margins: 20
        stepSize: step
        maximumValue: maxVal
        minimumValue: minVal
        style: customStyle
//      onValueChanged: print("From Slider.qml" ,value)
    }

    Component {
        id: customStyle
        SliderStyle {
            handle: Rectangle {
                width: 20
                height: 12
                antialiasing: true
                color: Qt.lighter("#468bb7", 1.2)
            }

            groove: Item {
                implicitHeight: root.height
                implicitWidth: root.width
                Rectangle {
                    height: 8
                    width: parent.width
                    anchors.verticalCenter: parent.verticalCenter
                    color: "#847878"
                    opacity: 0.8
                    Rectangle {
                        antialiasing: true
                        radius: 1
                        color: "#1a0d0d"
                        height: parent.height
                        width: parent.width * control.value / control.maximumValue
                    }
                }
            }
        }
    }
}

在另一个文件中test.qml我正在使用这个滑块

test.qml
import QtQuick 2.3

Rectangle {
    id: test

    width: 640; height: 480

    Slider {
        id: slider
        width: 300
        height: 30
        anchors.centerIn: parent
        maxVal: 1000
        minVal: 0
        step: 50
        val: 500 // when commented out, onValChanged is triggered on sliding
        onValChanged: print(val)
    }
}

我想在 test.qml 中实例化时使用 属性 val 将滑块设置为初始值。但是当我设置初始值时,滑动滑块时 onValChanged 不会被触发。但是当我评论那条线(val: 500)时,滑动滑块时会触发 onValChanged,但滑块以我不想要的初始值 0 开始。我不明白我在这里做错了什么!

将 属性 val 设置为特定值 覆盖 绑定,如 slider 组件中所定义。一旦绑定丢失,滑块的任何更新都不会传送到 val,从而导致您遇到的行为。另一方面,如果您不设置 属性,绑定将保持不变,即随着滑块值的变化,val 的值会相应变化,从而触发信号。

在这种情况下,这不是可行的方法,还因为您要添加一组属性,这些属性只公开了 Slider 的内部属性。只需使用属性 alias:

Property aliases are properties which hold a reference to another property. Unlike an ordinary property definition, which allocates a new, unique storage space for the property, a property alias connects the newly declared property (called the aliasing property) as a direct reference to an existing property (the aliased property).

重写 Slider.qml 中的属性,如下所示:

property alias val: slider.value
property alias maxVal: slider.maximumValue
property alias minVal: slider.minimumValue
property alias step: slider.stepSize

这样valslider.value并且设置为500直接影响滑​​块而不破坏任何绑定

在旁注中,你也可以写成

property alias maximumValue: slider.maximumValue

即使用 非常相同的名称 公开内部属性,以保持 API 命名的一致性。