QML 2 中的样式化 GroupBox
Styling GroupBox in QML 2
我想在 QML 2 中按如下方式设置 GroupBox 的样式:
我没有找到如何在 QML 2 中执行此操作。在下一页中,Customizing Qt Quick controls 没有关于样式标题的信息。
你可以这样做:
GroupBox {
id: control
title: qsTr("GroupBox")
anchors.centerIn: parent
width: 300
height: 150
background: Rectangle {
y: control.topPadding - control.padding
width: parent.width
height: parent.height - control.topPadding + control.padding
color: "transparent"
border.color: "#21be2b"
radius: 2
}
label: Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.top
anchors.bottomMargin: -height/2
color: "white" //set this to the background color
width: parent.width * 0.7
height: title.font.pixelSize
Text {
id: title
text: qsTr("My Tilte")
anchors.centerIn: parent
font.pixelSize: 32
}
}
}
如果您希望标签透明,更复杂的解决方案是使用 Canvas 绘制背景矩形:
CustomBox.qml
import QtQuick 2.7
Item {
id: box
property string borderColor: "black"
property int borderWidth: 1
onWidthChanged: canvas.requestPaint()
onHeightChanged: canvas.requestPaint()
Canvas {
id: canvas
anchors.fill: parent
antialiasing: true
onPaint: {
var ctx = canvas.getContext('2d')
ctx.strokeStyle = box.borderColor
ctx.lineWidth = box.borderWidth
ctx.beginPath()
ctx.moveTo(width*0.15, 0)
ctx.lineTo(0, 0)
ctx.lineTo(0, height)
ctx.lineTo(width, height)
ctx.lineTo(width, 0)
ctx.lineTo(width - width * 0.15, 0)
ctx.stroke()
}
}
}
然后您可以像这样使用它:
GroupBox {
id: control
title: qsTr("GroupBox")
anchors.centerIn: parent
width: 300
height: 150
background: CustomBox {
y: control.topPadding - control.padding
width: parent.width
height: parent.height - control.topPadding + control.padding
borderColor: "black"
borderWidth: 1
}
label: Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.top
anchors.bottomMargin: -height/2
color: "transparent"
width: parent.width * 0.7
height: title.font.pixelSize
Text {
id: title
text: qsTr("Settings")
anchors.centerIn: parent
font.pixelSize: 32
}
}
}
试试这个:
GroupBox{
id: id_keyListBox
label: Label{
text: "Choose an account to see details"
color: "blue"
}
可以用label.x设置在中间
GroupBox {
title: "Potato"
label.x: width/2 - label.contentWidth/2
Label {
text: "Wubba lubba dub dub."
}
}
我想在 QML 2 中按如下方式设置 GroupBox 的样式:
我没有找到如何在 QML 2 中执行此操作。在下一页中,Customizing Qt Quick controls 没有关于样式标题的信息。
你可以这样做:
GroupBox {
id: control
title: qsTr("GroupBox")
anchors.centerIn: parent
width: 300
height: 150
background: Rectangle {
y: control.topPadding - control.padding
width: parent.width
height: parent.height - control.topPadding + control.padding
color: "transparent"
border.color: "#21be2b"
radius: 2
}
label: Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.top
anchors.bottomMargin: -height/2
color: "white" //set this to the background color
width: parent.width * 0.7
height: title.font.pixelSize
Text {
id: title
text: qsTr("My Tilte")
anchors.centerIn: parent
font.pixelSize: 32
}
}
}
如果您希望标签透明,更复杂的解决方案是使用 Canvas 绘制背景矩形:
CustomBox.qml
import QtQuick 2.7
Item {
id: box
property string borderColor: "black"
property int borderWidth: 1
onWidthChanged: canvas.requestPaint()
onHeightChanged: canvas.requestPaint()
Canvas {
id: canvas
anchors.fill: parent
antialiasing: true
onPaint: {
var ctx = canvas.getContext('2d')
ctx.strokeStyle = box.borderColor
ctx.lineWidth = box.borderWidth
ctx.beginPath()
ctx.moveTo(width*0.15, 0)
ctx.lineTo(0, 0)
ctx.lineTo(0, height)
ctx.lineTo(width, height)
ctx.lineTo(width, 0)
ctx.lineTo(width - width * 0.15, 0)
ctx.stroke()
}
}
}
然后您可以像这样使用它:
GroupBox {
id: control
title: qsTr("GroupBox")
anchors.centerIn: parent
width: 300
height: 150
background: CustomBox {
y: control.topPadding - control.padding
width: parent.width
height: parent.height - control.topPadding + control.padding
borderColor: "black"
borderWidth: 1
}
label: Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.top
anchors.bottomMargin: -height/2
color: "transparent"
width: parent.width * 0.7
height: title.font.pixelSize
Text {
id: title
text: qsTr("Settings")
anchors.centerIn: parent
font.pixelSize: 32
}
}
}
试试这个:
GroupBox{
id: id_keyListBox
label: Label{
text: "Choose an account to see details"
color: "blue"
}
可以用label.x设置在中间
GroupBox {
title: "Potato"
label.x: width/2 - label.contentWidth/2
Label {
text: "Wubba lubba dub dub."
}
}