我正在使用 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 http://doc.qt.io/qt-5/qtqml-syntax-objectattributes.html:
属性别名是持有的属性对另一个属性的引用。与普通属性定义不同,普通属性定义为属性分配新的、唯一的存储空间,属性别名连接新声明的属性(称为别名属性)作为对现有属性的直接引用(别名属性)。
重写里面的属性Slider.qml
如下:
property alias val: slider.value
property alias maxVal: slider.maximumValue
property alias minVal: slider.minimumValue
property alias step: slider.stepSize
这边走val
is slider.value
并将其设置为500
直接影响滑块而不破坏任何绑定。
在旁注中,您还可以例如写
property alias maximumValue: slider.maximumValue
即暴露内部属性及其非常相同的名字保持 API 命名的一致性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)