【问题标题】:Items not correctly spread across GridLayout项目未正确分布在 GridLayout 中
【发布时间】:2016-03-16 16:55:12
【问题描述】:

我有以下自定义 QML Item,它将代表一个密码输入 GUI 元素:

import QtQuick 2.0
import QtQuick.Layouts 1.2
import QtQuick.Controls 1.3

import "../items"

Item
{
    id: ueKeypad

    width: 512
    height: 512

    Rectangle
    {
        id: ueKeypadWrapper
        antialiasing: true

        anchors.fill: parent

        ColumnLayout
        {
            id: ueKeypadLayoutMain
            antialiasing: true

            layoutDirection: Qt.LeftToRight
            spacing: 8

            anchors.fill: parent

            ColumnLayout
            {
                id: ueKeypadTitleLayout

                layoutDirection: Qt.LeftToRight

                Layout.fillWidth: true

                Layout.minimumHeight: 24
                Layout.preferredHeight: 24
                Layout.maximumHeight: 24

                Text
                {
                    Layout.fillWidth: true
                    Layout.fillHeight: true

                    text: qsTr("PIN ENTRY")
                    clip: true
                    font.bold: true
                    font.pointSize: 24
                    textFormat: Text.RichText
                    verticalAlignment: Text.AlignVCenter
                    horizontalAlignment: Text.AlignHCenter
                }   // Text
            }   // ColumnLayout

            GridLayout
            {
                id: ueKeypadNumbersLayout

                Layout.fillWidth: true
                Layout.fillHeight: true

                Layout.alignment: Qt.AlignHCenter|Qt.AlignVCenter

                layoutDirection: Qt.LeftToRight

                columnSpacing: 8
                rowSpacing: 8

                flow: GridLayout.LeftToRight

                columns: 3

                UeButton
                {
                    id: ueKeypadButton1

                    Layout.minimumHeight: 32
                    Layout.preferredHeight: 32
                    Layout.maximumHeight: 32

                    ueText: qsTr("1")
                }

                UeButton
                {
                    id: ueKeypadButton2

                    Layout.minimumHeight: 32
                    Layout.preferredHeight: 32
                    Layout.maximumHeight: 32

                    ueText: qsTr("2")
                }

                UeButton
                {
                    id: ueKeypadButton3

                    Layout.minimumHeight: 32
                    Layout.preferredHeight: 32
                    Layout.maximumHeight: 32

                    ueText: qsTr("3")
                }

                UeButton
                {
                    id: ueKeypadButton4

                    Layout.minimumHeight: 32
                    Layout.preferredHeight: 32
                    Layout.maximumHeight: 32

                    ueText: qsTr("4")
                }

                UeButton
                {
                    id: ueKeypadButton5

                    Layout.minimumHeight: 32
                    Layout.preferredHeight: 32
                    Layout.maximumHeight: 32

                    ueText: qsTr("5")
                }

                UeButton
                {
                    id: ueKeypadButton6

                    Layout.minimumHeight: 32
                    Layout.preferredHeight: 32
                    Layout.maximumHeight: 32

                    ueText: qsTr("6")
                }

                UeButton
                {
                    id: ueKeypadButton7

                    Layout.minimumHeight: 32
                    Layout.preferredHeight: 32
                    Layout.maximumHeight: 32

                    ueText: qsTr("7")
                }

                UeButton
                {
                    id: ueKeypadButton8

                    Layout.minimumHeight: 32
                    Layout.preferredHeight: 32
                    Layout.maximumHeight: 32

                    ueText: qsTr("8")
                }

                UeButton
                {
                    id: ueKeypadButton9

                    Layout.minimumHeight: 32
                    Layout.preferredHeight: 32
                    Layout.maximumHeight: 32

                    ueText: qsTr("9")
                }
            }   // GridLayout

            RowLayout
            {
                id: ueKeypadActionLayout

                Layout.fillWidth: true
                Layout.fillHeight: true

                Layout.alignment: Qt.AlignHCenter|Qt.AlignVCenter

                layoutDirection: Qt.LeftToRight

                spacing: 8

                UeButton
                {
                    id: ueKeypadButtonOk

                    ueText: qsTr("Ok")
                }   // UeButton

                UeButton
                {
                    id: ueKeypadButton0

                    ueText: qsTr("0")

                    Layout.minimumHeight: 32
                    Layout.preferredHeight: 32
                    Layout.maximumHeight: 32
                }   // UeButton

                UeButton
                {
                    id: ueKeypadButtonCancel

                    ueText: qsTr("Cancel")
                }   // UeButton
            }   // RowLayout
        }   // ColumnLayout
    }   // Rectangle
}   // Item

它使用自定义 QML Button,命名为 UeButton

import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick 2.5

Button
{
    property string ueText

    id: ueButton

    text: ueText

    style: ButtonStyle
    {
        background: Rectangle
        {
            antialiasing: true
            smooth: true
            gradient: Gradient
            {
                GradientStop
                {
                    position: 0
                    color: "#ffffff"
                }   // GradientStop

                GradientStop
                {
                    position: 0.418
                    color: "#000000"
                }   // GradientStop
            }   // Gradient

            border.color: "steelblue"
            border.width: control.activeFocus?2:1
            radius: 4
        }   // background

        label: Text
        {
            color: "#ffffff"
            font.bold: true
            verticalAlignment: Text.AlignVCenter
            horizontalAlignment: Text.AlignHCenter
            font.pointSize: 16

            text: control.text
        }   // label
    }   // ButtonStyle
}   // ueButton

如果我在 QtCreator 的设计器工具中查看第一个代码,我会得到以下情况:

为什么Buttons 没有分布在GridLayout 中?较低的RowLayout 也是如此,其Items(三个Items 类型为UeButton)没有在整个RowLayout 中居中和对齐?

【问题讨论】:

    标签: qt qml grid-layout qtquick2


    【解决方案1】:

    Layout 的附加属性确保包含的Items 的大小正确。给定的约束。

    Items 可以被拉伸以填满可用空间(fillWidth/fillHeight),在某个值下强制不收缩(minimumWidth/minimumHeight)或在某个其他值上不放大(maximumWidth/maximumHeight)。您还可以强制 Item 占据多于一行/列 (rowSpan/columnSpan) 并假定特定大小 (preferredWidth/preferredHeight 这意味着 minimum == maximum) .

    优先级为:

    preferredminimum/maximumwidth/height

    将属性设置到左侧会自动丢弃右侧的任何属性。你可以很容易地理解这背后的原因。这个方案可能会被implicitWidth/implicitHeight 稍微“破坏”,因为任何Item 的大小都不能在这些值下缩小。 fill 属性确保Item 填充可用空间,根据上面的约束:如果fill 未定义,Item 不能根据其约束增长或缩小。

    现在,如果您希望Buttons 保持它们的纵横比并仍然拉伸网格,您可以使用 intermediate Item。在将Layout 附加属性应用于外部Item 时,Buttons 可以是centerIn 并且不受影响。

    示例代码:

    import QtQuick 2.5
    import QtQuick.Window 2.2
    import QtQuick.Layouts 1.1
    import QtQuick.Controls 1.4
    
    Window {
        width: 200; height: 200; minimumHeight: 100; visible: true
    
        GridLayout {
            anchors.fill: parent
            rows: 3
            columns: 3
    
            Repeater {
                model: 9
    
                Item {
                    Layout.fillWidth: true
                    Layout.fillHeight: true
    
                    Button { anchors.centerIn: parent; width: 32; height: 32; text: index + 1 }
                }
            }
        }
    }
    

    如果您希望Buttons 填充可用空间,则只需指定fillWidth/fillHeight。由于没有设置其他布局约束(例如minimum*maximum*),Buttons 正确占据了所有可用空间。这是上面重新访问的代码。正如预期的那样,widthheight 被简单地丢弃:

    import QtQuick 2.5
    import QtQuick.Window 2.2
    import QtQuick.Layouts 1.1
    import QtQuick.Controls 1.4
    
    Window {
        width: 200; height: 200; minimumHeight: 100; visible: true
    
        GridLayout {
            anchors.fill: parent
            rows: 3
            columns: 3
    
            Repeater {
                model: 9
    
                Button {width: 32; height: 32; text: index + 1;   // 32? NOPE!
                    Layout.fillWidth: true; Layout.fillHeight: true
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 2016-06-25
      相关资源
      最近更新 更多