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

时间:2015-05-23 17:52:06

标签: qt qml qtquick2

我有一个自定义按钮:

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}中所有可用空间的所有按钮。我怎样才能做到这一点?感谢。

2 个答案:

答案 0 :(得分:4)

Grid只需将商品放在其中,尊重商品'尺寸。要主动调整项目的大小,您需要使用GridLayout,并告诉它应如何使用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
        }

其中grid将是网格的ID。

答案 1 :(得分:0)

如果不使用价格稍贵的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
                }
            }
        }
    }
}