为每个 TumblerColumn 添加自定义边框
Adding a custom border for each TumblerColumn
我刚刚开始研究 QML 和 QT Quick Controls,并一直在研究 Tumbler 控件。目前,我修改了示例并尝试对其进行自定义以感受控件。
所以,它的立场是这样的:
Tumbler {
id: tumbler
anchors.centerIn: parent
Label {
id: characterMetrics
font.bold: true
font.pixelSize: textSingleton.font.pixelSize * 1.25
visible: false
text: "M"
}
// Just add the month column for simplicity
TumblerColumn {
id: monthColumn
width: characterMetrics.width * 3 + tumbler.delegateTextMargins
model: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
}
}
现在我已经覆盖了大部分默认样式如下:
style: TumblerStyle {
id: tumblerStyle
delegate: Item {
implicitHeight: (tumbler.height - padding.top - padding.bottom) / tumblerStyle.visibleItemCount
Text {
id: label
text: styleData.value
color: styleData.current ? "#52E16D" : "#808285"
font.bold: true
font.pixelSize: textSingleton.font.pixelSize * 1.5
opacity: 0.4 + Math.max(0, 1 - Math.abs(styleData.displacement)) * 0.6
anchors.centerIn: parent
}
}
// No frame
property Component frame: Canvas {
onPaint: {
}
}
property Component separator: Canvas {
implicitWidth: Math.max(10, Math.round(textSingleton.implicitHeight * 0.4))
onPaint: {
// Do not draw any separator
}
}
// No gradient background
property Component background: Rectangle {
}
property Component foreground: Item {
clip: true
Rectangle {
id: rect
anchors.fill: parent
// Go one pixel larger than our parent so that we can hide our one pixel frame
// that the shadow is created from.
anchors.margins: -1
color: "transparent"
border.color: "black"
visible: false
}
DropShadow {
}
}
}
现在我想要做的不是围绕整个 tumbler 控件设置一个框架,我只想在 TumblerColumn 的顶部和底部画一条线。所以可以想象我的 Tumbler 有很多 TumblerColumns,我只想能够基本上能够沿着控件的宽度和底部在控件的顶部画一条线。
但是,似乎使用 TumblerStyle,我只能修改影响整个 Tumbler 控件的内容。如何装饰单个 TumblerColumn?
使用TumblerColumn
的columnForeground
属性:
import QtQuick 2.4
import QtQuick.Window 2.0
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QtQuick.Extras 1.2
Window {
id: root
width: 600
height: 400
visible: true
Tumbler {
id: tumbler
anchors.centerIn: parent
Label {
id: characterMetrics
font.bold: true
visible: false
text: "M"
}
// Just add the month column for simplicity
TumblerColumn {
id: monthColumn
width: characterMetrics.width * 3
model: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
columnForeground: Item {
Rectangle {
width: parent.width
height: 1
color: "#808285"
}
Rectangle {
width: parent.width
height: 1
color: "#808285"
anchors.bottom: parent.bottom
}
}
}
style: TumblerStyle {
id: tumblerStyle
delegate: Item {
implicitHeight: (tumbler.height - padding.top - padding.bottom) / tumblerStyle.visibleItemCount
Text {
id: label
text: styleData.value
color: styleData.current ? "#52E16D" : "#808285"
font.bold: true
opacity: 0.4 + Math.max(0, 1 - Math.abs(styleData.displacement)) * 0.6
anchors.centerIn: parent
}
}
// No frame
property Component frame: Item {}
// Do not draw any separator
property Component separator: Item {}
// No gradient background
property Component background: Rectangle {}
property Component foreground: Item {}
}
}
}
如果要对所有列使用相同的前景,请改用 TumblerStyle
中的 columnForeground
属性。
我刚刚开始研究 QML 和 QT Quick Controls,并一直在研究 Tumbler 控件。目前,我修改了示例并尝试对其进行自定义以感受控件。
所以,它的立场是这样的:
Tumbler {
id: tumbler
anchors.centerIn: parent
Label {
id: characterMetrics
font.bold: true
font.pixelSize: textSingleton.font.pixelSize * 1.25
visible: false
text: "M"
}
// Just add the month column for simplicity
TumblerColumn {
id: monthColumn
width: characterMetrics.width * 3 + tumbler.delegateTextMargins
model: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
}
}
现在我已经覆盖了大部分默认样式如下:
style: TumblerStyle {
id: tumblerStyle
delegate: Item {
implicitHeight: (tumbler.height - padding.top - padding.bottom) / tumblerStyle.visibleItemCount
Text {
id: label
text: styleData.value
color: styleData.current ? "#52E16D" : "#808285"
font.bold: true
font.pixelSize: textSingleton.font.pixelSize * 1.5
opacity: 0.4 + Math.max(0, 1 - Math.abs(styleData.displacement)) * 0.6
anchors.centerIn: parent
}
}
// No frame
property Component frame: Canvas {
onPaint: {
}
}
property Component separator: Canvas {
implicitWidth: Math.max(10, Math.round(textSingleton.implicitHeight * 0.4))
onPaint: {
// Do not draw any separator
}
}
// No gradient background
property Component background: Rectangle {
}
property Component foreground: Item {
clip: true
Rectangle {
id: rect
anchors.fill: parent
// Go one pixel larger than our parent so that we can hide our one pixel frame
// that the shadow is created from.
anchors.margins: -1
color: "transparent"
border.color: "black"
visible: false
}
DropShadow {
}
}
}
现在我想要做的不是围绕整个 tumbler 控件设置一个框架,我只想在 TumblerColumn 的顶部和底部画一条线。所以可以想象我的 Tumbler 有很多 TumblerColumns,我只想能够基本上能够沿着控件的宽度和底部在控件的顶部画一条线。
但是,似乎使用 TumblerStyle,我只能修改影响整个 Tumbler 控件的内容。如何装饰单个 TumblerColumn?
使用TumblerColumn
的columnForeground
属性:
import QtQuick 2.4
import QtQuick.Window 2.0
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2
import QtQuick.Extras 1.2
Window {
id: root
width: 600
height: 400
visible: true
Tumbler {
id: tumbler
anchors.centerIn: parent
Label {
id: characterMetrics
font.bold: true
visible: false
text: "M"
}
// Just add the month column for simplicity
TumblerColumn {
id: monthColumn
width: characterMetrics.width * 3
model: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
columnForeground: Item {
Rectangle {
width: parent.width
height: 1
color: "#808285"
}
Rectangle {
width: parent.width
height: 1
color: "#808285"
anchors.bottom: parent.bottom
}
}
}
style: TumblerStyle {
id: tumblerStyle
delegate: Item {
implicitHeight: (tumbler.height - padding.top - padding.bottom) / tumblerStyle.visibleItemCount
Text {
id: label
text: styleData.value
color: styleData.current ? "#52E16D" : "#808285"
font.bold: true
opacity: 0.4 + Math.max(0, 1 - Math.abs(styleData.displacement)) * 0.6
anchors.centerIn: parent
}
}
// No frame
property Component frame: Item {}
// Do not draw any separator
property Component separator: Item {}
// No gradient background
property Component background: Rectangle {}
property Component foreground: Item {}
}
}
}
如果要对所有列使用相同的前景,请改用 TumblerStyle
中的 columnForeground
属性。