如何在 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
这样val
是slider.value
并且设置为500
直接影响滑块而不破坏任何绑定
在旁注中,你也可以写成
property alias maximumValue: slider.maximumValue
即使用 非常相同的名称 公开内部属性,以保持 API 命名的一致性。
我正在使用 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
这样val
是slider.value
并且设置为500
直接影响滑块而不破坏任何绑定
在旁注中,你也可以写成
property alias maximumValue: slider.maximumValue
即使用 非常相同的名称 公开内部属性,以保持 API 命名的一致性。