Qml滑块样式,滑块手柄前后分配不同的凹槽颜色
Qml slider style, assigning different groove color before and after the slider's handle
所以我想创建一个滑块样式,类似于默认样式,也更符合我的应用程序样式,但我发现很难在滑块手柄前后分配不同的颜色。
这是我的代码的简化版本,没有渐变、锚点和其他属性:
Slider{
id: widthSlider
style: SliderStyle {
groove: Rectangle {
height: widthSlider.height*0.17
width: widthSlider.width
color: "black"
radius: 8
}
handle: Rectangle {
color: "grey"
}
}
}
我尝试了一个粗略的解决方法,将两个矩形放在滑块中,固定在手柄位置,如下所示:
Slider{
id: widthSlider
Rectangle {
anchors.left: widthSlider.left
anchors.right: widthSlider.__handlePos
color: "black"
}
Rectangle {
anchors.left: widthSlider.__handlePos
anchors.right: widthSlider.right
color: "white"
}
...
}
但我无法定位到手柄的位置,因为它只是一个双精度(我收到错误:无法将双精度分配给 QQuickAnchorLine)。
有人知道我如何在 Qml 中执行此操作吗?
是这样的吗?
Slider {
anchors.centerIn: parent
value: 0.5
width: 400
style: SliderStyle {
groove: Item {
implicitHeight: 10
LinearGradient {
anchors.fill: parent
start: Qt.point(0, control.height / 2)
end: Qt.point(control.width, control.height / 2)
gradient: Gradient {
GradientStop { position: 0.0; color: "orange" }
GradientStop { position: control.value; color: "brown" }
GradientStop { position: 1.0; color: "orange" }
}
}
}
}
}
或者:
Slider {
anchors.centerIn: parent
value: 0.5
width: 400
style: SliderStyle {
groove: Rectangle {
implicitHeight: 10
color: "lightgrey"
border {
color: "#999"
width: 1
}
Rectangle {
implicitHeight: 10
color: "orange"
implicitWidth: control.value * parent.width
border {
color: "#999"
width: 1
}
}
}
}
}
我意识到这是一个老问题。但是,为了将来参考,表示句柄前颜色的 Rectangle
的宽度应为 styleData.handlePosition
。下面的代码来自 具有此更改的第二个解决方案。
Slider {
anchors.centerIn: parent
value: 0.5
width: 400
style: SliderStyle {
groove: Rectangle {
implicitHeight: 10
color: "lightgrey"
border {
color: "#999"
width: 1
}
Rectangle {
implicitHeight: 10
color: "orange"
implicitWidth: styleData.handlePosition
border {
color: "#999"
width: 1
}
}
}
}
}
所以我想创建一个滑块样式,类似于默认样式,也更符合我的应用程序样式,但我发现很难在滑块手柄前后分配不同的颜色。
这是我的代码的简化版本,没有渐变、锚点和其他属性:
Slider{
id: widthSlider
style: SliderStyle {
groove: Rectangle {
height: widthSlider.height*0.17
width: widthSlider.width
color: "black"
radius: 8
}
handle: Rectangle {
color: "grey"
}
}
}
我尝试了一个粗略的解决方法,将两个矩形放在滑块中,固定在手柄位置,如下所示:
Slider{
id: widthSlider
Rectangle {
anchors.left: widthSlider.left
anchors.right: widthSlider.__handlePos
color: "black"
}
Rectangle {
anchors.left: widthSlider.__handlePos
anchors.right: widthSlider.right
color: "white"
}
...
}
但我无法定位到手柄的位置,因为它只是一个双精度(我收到错误:无法将双精度分配给 QQuickAnchorLine)。
有人知道我如何在 Qml 中执行此操作吗?
是这样的吗?
Slider {
anchors.centerIn: parent
value: 0.5
width: 400
style: SliderStyle {
groove: Item {
implicitHeight: 10
LinearGradient {
anchors.fill: parent
start: Qt.point(0, control.height / 2)
end: Qt.point(control.width, control.height / 2)
gradient: Gradient {
GradientStop { position: 0.0; color: "orange" }
GradientStop { position: control.value; color: "brown" }
GradientStop { position: 1.0; color: "orange" }
}
}
}
}
}
或者:
Slider {
anchors.centerIn: parent
value: 0.5
width: 400
style: SliderStyle {
groove: Rectangle {
implicitHeight: 10
color: "lightgrey"
border {
color: "#999"
width: 1
}
Rectangle {
implicitHeight: 10
color: "orange"
implicitWidth: control.value * parent.width
border {
color: "#999"
width: 1
}
}
}
}
}
我意识到这是一个老问题。但是,为了将来参考,表示句柄前颜色的 Rectangle
的宽度应为 styleData.handlePosition
。下面的代码来自
Slider {
anchors.centerIn: parent
value: 0.5
width: 400
style: SliderStyle {
groove: Rectangle {
implicitHeight: 10
color: "lightgrey"
border {
color: "#999"
width: 1
}
Rectangle {
implicitHeight: 10
color: "orange"
implicitWidth: styleData.handlePosition
border {
color: "#999"
width: 1
}
}
}
}
}