我正在使用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,我不想要。我不明白我在这里做错了什么!
答案 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命名的一致性。