Qt Quick 响应式布局

布局是一种制作可调整尺寸用户界面的良好技术。然而,这种方法有其局限性,因为我们不能无限地缩小和扩大项,而不会牺牲可用性和美观。在某个时候,重新组织、删除或添加某些元素会更有意义。适应不同设备(例如手机和平板电脑)和屏幕方向(横向或纵向)可以类似实现。这就是我们通常所说的响应式布局,而 Qt Quick 布局 提供各种 API 来实现它们。

静态层次结构,自适应布局

布局具有层次结构,这通常由声明性的 QML 代码定义。对于某些简单的响应式布局,保持层次结构不变,而仅仅调整影响布局的一些属性就足够了。

声明性描述

改变布局最简单的方法是修改布局属性和与其关联的属性,使用小的表达式。例如,可以使用三元运算符来根据其宽度修改布局。可以以相同的方式修改Item 属性,例如 Item.visible,隐藏或显示界面的一部分。

在以下代码片段中,使用此概念在窗口宽度小于某个值时将两列布局更改为单列布局。

GridLayout {
    columns: width < 300 ? 1 : 2
    anchors.fill: parent

    Rectangle {
        id: rectangle1
        color: "tomato"
        Layout.fillHeight: true
        Layout.fillWidth: true
    }

    Rectangle {
        id: rectangle2
        color: "lightskyblue"
        Layout.fillHeight: true
        Layout.fillWidth: true
    }
}

结果布局如下,具体取决于窗口宽度。

布局和项的各个层次可以嵌套,但项只能在其 Item.parent 内移动。

状态

使用 Qt Quick 状态 可以实现相同的结果。使用状态的优点是,特定布局的 Layout 属性会在 QML 文件的单个地方收集(至少是那些会变化的属性)。之前显示的示例可以按照以下方式实现,结果看起来和表现完全相同。

GridLayout {
    anchors.fill: parent

    Rectangle {
        id: rectangle1
        color: "tomato"
        Layout.fillHeight: true
        Layout.fillWidth: true
    }

    Rectangle {
        id: rectangle2
        color: "lightskyblue"
        Layout.fillHeight: true
        Layout.fillWidth: true
    }

    states: [
        State {
            when: width < 300
            PropertyChanges { target: rectangle2; Layout.row: 1 }
            PropertyChanges { target: rectangle2; Layout.column: 0 }
        },
        State {
            when: width >= 300
            PropertyChanges { target: rectangle2; Layout.row: 0 }
            PropertyChanges { target: rectangle2; Layout.column: 1 }
        }
    ]
}

LayoutItemProxy

第三种方法是应用 LayoutItemProxy。可以找到之前显示的最简示例的实现方式在类型文档中。与之前显示的解决方案相比,LayoutItemProxy 允许为各种形式因素声明完全独立的布局。特别是对于更复杂的布局,这可能有助于提高和维护合理的源代码结构。

请注意,LayoutItemProxy API 是一种技术预览,可能在未来的 Qt 版本中更改或删除。

自适应层次结构,自适应布局

布局的更复杂重构可能需要修改层次结构。在一个小型布局中,一个小型独立按钮可能与其他按钮组合并放入一个更大布局的框中。在一个布局中完全可见的项目,可能需要在另一个较小布局中使用Flickable。在这种情况下,最好依赖于LayoutItemProxy。该Items可以在各种层次结构级别以及不同的Item.parent之间移动。

Qt Quick 布局 - 自适应布局示例展示了将项目在不同层次结构级别之间移动的情况,在某次移动中被放入Flickable,在另一次移动中被放置在顶部级别布局中。生成的两个布局如下。

许多设计指南提供创建自适应布局的帮助和技巧。可以使用上述API实现相应的技术。更多信息请参阅以下链接

© 2024 Qt 公司有限公司。此处包含的文档贡献是各自所有者的版权。提供的文档是根据自由软件基金会发布的GNU 自由文档许可证版本 1.3的条款许可的。Qt及其相关标志是芬兰的Qt公司及其在世界其他地区的商标。所有其他商标均为其各自所有者的财产。