QML。如何为所有父级拉伸网格 space

QML. How to stretch Grid for all parent space

我有一个自定义按钮:

import QtQuick 2.0

Rectangle {
    id: xobutton
    width: 100
    height: 100
    property string label: "?"
    border.width: 2

    Text {
        id: xobuttonLabel
        text: label
        font.pointSize: 75
        anchors.centerIn: parent
    } 
}

它有一个父级 Rectangle:

Rectangle {
    width: 500
    height: 500

    Grid {
        anchors.centerIn: parent
        rows: 3; columns: 3; spacing: 0

        Repeater {
            model: 9
            Xobtn { }
        }
    } 
}

我需要拉伸 Grid 中的所有按钮以获得父 Rectangle 中的所有免费 space。我怎样才能做到这一点?谢谢。

Grid 只是根据项目的大小在其中放置项目。要主动调整项目大小,您需要使用 GridLayout, and tell it how the items should be resized with Layout attached properties。所以你的代码变成这样,注释显示你的代码的变化:

import QtQuick.Layouts 1.1 // needed for GridLayout

Rectangle {
    width: 500
    height: 500

    GridLayout {
        anchors.fill: parent // GridLayout must have the right size now
        rows: 3; columns: 3
        columnSpacing: 0; rowSpacing: 0 // changed from spacing: 0

        Repeater {
            model: 9
            Xobtn {
                // attached properties guiding resizing
                Layout.fillHeight: true
                Layout.fillWidth: true 
            }
        }
    }
}

如果您出于某种原因不想依赖 QtQuick.Layouts,那么您必须自己计算 widthheight,但如果您需要,这会很笨拙除了统一的网格之外的任何东西,比如:

        Xobtn {
            height: grid.parent.height / grid.columns - grid.spacing
            width: grid.parent.width / grid.rows - grid.spacing
        }

其中 gridGrid 的 ID。

不使用稍微贵一点的QtQuick.Layouts,你可以这样做(但你需要知道你放在网格中的项目的大小:

import QtQuick 2.0

Rectangle {
    id: root
    width: 500
    height: 500

    readonly property int rectSize: 100

    Grid {
        anchors.centerIn: parent
        rows: 3; columns: 3;

        columnSpacing: (parent.width - (root.rectSize * columns)) / (columns - 1)
        rowSpacing: (parent.height - (root.rectSize * rows)) / (rows - 1)

        Repeater {
            model: parent.rows * parent.columns

            Rectangle {
                id: xobutton
                width: root.rectSize
                height: root.rectSize
                property string label: "?"
                border.width: 2

                Text {
                    id: xobuttonLabel
                    text: label
                    font.pointSize: 75
                    anchors.centerIn: parent
                }
            }
        }
    }
}