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

时间:2015-03-17 10:48:13

标签: qt slider 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.qmlval中实例化时将滑块设置为初始值。但是当我设置初始值时,滑动滑块时不会触发onValChanged。但当我评论该行(val: 500)时,滑块滑动时会触发onValChanged,但滑块的初始值为0,我不想要。我不明白我在这里做错了什么!

1 个答案:

答案 0 :(得分:2)

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

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

  

属性别名是包含对另一个属性的引用的属性。与为属性分配新的唯一存储空间的普通属性定义不同,属性别名将新声明的属性(称为别名属性)连接为对现有属性的直接引用(别名属性)。

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

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

这种方式val slider.value并将其设置为500会直接影响滑​​块,而不会破坏任何绑定。

在旁注中,您还可以编写

property alias maximumValue: slider.maximumValue

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