pra*_*ra7 2 qt qml qtquick2 qtquickcontrols2
我想在 QML 2 中设置 GroupBox 的样式,如下所示:
我没有找到如何在 QML 2 中执行此操作。在下一页“自定义 Qt Quick 控件”中,没有有关样式标题的信息。
你可以这样做:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您希望标签透明,更复杂的解决方案是使用 Canvas 绘制背景矩形:
自定义框.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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)