QML 2 中的 GroupBox 样式

pra*_*ra7 2 qt qml qtquick2 qtquickcontrols2

我想在 QML 2 中设置 GroupBox 的样式,如下所示:

在此输入图像描述

我没有找到如何在 QML 2 中执行此操作。在下一页“自定义 Qt Quick 控件”中,没有有关样式标题的信息。

luf*_*ffy 5

你可以这样做:

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)