QML布局概述(Qt Quick Layouts Overview)

Posted linkyip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QML布局概述(Qt Quick Layouts Overview)相关的知识,希望对你有一定的参考价值。

Qt Quick布局(Qt Quick Layouts)概述

Qt Quick Layouts是用于在用户界面中排列Items的, 它们本身也是Items。 由于Qt Quick Layouts也可以调整其本身的大小,因此非常适合可调整大小的用户界面.

首先

使用import语句将QML类型导入到您的应用程序中

import QtQuick.Layouts 1.11

关键点

关键点:

  • 可以使用Layout.alignment属性指定项目的对齐方式
  • 可调整大小的Item可以使用Layout.fillWidth和Layout.fillHeight属性指定
  • 可以使用Layout.minimumWidth,Layout.preferredWidth和Layout.maximumWidth属性指定尺寸限制(“width”可以替换为“height”,就指定的是height的限制)
  • 可以使用space,rowSpacing或columnSpacing来指定间距
    除上述功能外,GridLayout还添加了以下功能:
  • 可以使用Layout.row和Layout.column属性确定Grid坐标
  • 自动Grid坐标和flow, rows, columns 参数一起使用
  • 可以使用Layout.rowSpan(Item所占行数)和Layout.columnSpan(Item所占列数)属性指定跨行或跨列的Item的跨度。

例子:

Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    RowLayout {
        anchors.fill: parent
        spacing: 6                  //布局中的所有Item之间的间距均为6像素
        Rectangle {
            color: "black"
            Layout.preferredWidth: 100  //建议宽度
            //Layout.preferredHeight: 150   //建议高度
            Layout.fillHeight: true         //占据为其分配的所有高度
        }
        Rectangle {
            color: "plum"
            Layout.fillWidth: true      //占据为其分配的所有宽度
            Layout.fillHeight: true     //占据为其分配的所有高度
        }
    }
}

注意: 布局负责分配其子Items的几何形状, 因此你不应指定子Items的width, height, x, y或其他任何可能影响布局的因素(如anchors等). 否则会产生冲突, 导致布局的结果具有不确定性. 如果子Item也是布局, 也同样要遵循这个原理. 因此,只有没有父布局的布局才能具有anchors.fill:parent.

大小控制

RowLayout {
    id: layout
    anchors.fill: parent
    spacing: 6
    Rectangle {
        color: ‘azure‘
        Layout.fillWidth: true
        Layout.minimumWidth: 50         //最小宽度50
        Layout.preferredWidth: 100      //建议宽度100
        Layout.maximumWidth: 300        //最大宽度300
        Layout.minimumHeight: 150       //最小高度150
        Text {
            anchors.centerIn: parent
            text: parent.width + ‘x‘ + parent.height
        }
    }
    Rectangle {
        color: ‘plum‘
        Layout.fillWidth: true
        Layout.minimumWidth: 100        //最小宽度
        Layout.preferredWidth: 200      //建议宽度
        Layout.preferredHeight: 100     //建议高度
        Text {
            anchors.centerIn: parent
            text: parent.width + ‘x‘ + parent.height
        }
    }
}

Loyout会组合每个Item的约束, 为布局元素提供最终的隐式约束. 如上述中子Item实际占用高宽如下表:

最小值 建议值 最大值
隐式约束 (width) 156 306
隐式约束 (height) 150 150 150

指定首选尺寸

当存在多个约束时, 它将按下表中的顺序查询这些候选属性,并使用具有有效宽度或高度的第一个候选:

候选属性 说明
Layout.preferredWidth 或 Layout.preferredHeight 如果默认的隐式大小未给出最佳设置,则应由应用程序修改这些属性。
implicitWidth 或 implicitHeight 这些属性应该由每个Item提供,以提供有意义的理想大小,例如,显示Text类型的所有内容所需的大小。 隐式宽度或高度0会被解析为无效。
width 和 height 如果以上属性均无效,则布局将会采纳width和height属性。

一个项目可以指定Layout.preferredWidth,而不必指定Layout.preferredHeight。 在这种情况下,有效的首选高度将由implicitHeight(或最终的height)确定。

注意: width或height属性仅作为最终的备用。 如果要覆盖首选大小,建议使用Layout.preferredWidth或Layout.preferredHeight。 依靠width或height属性来指定首选大小可能会带来一些意外的行为。 例如,更改width或height属性不会触发布局重新排列。 此外,当强制布局进行完全重建时,它可能会使用实际的宽度和高度,而不是QML文件中指定的宽度和高度。

连接windows和布局

你只可以通过锚定来设置Layout根据windows窗口大小来变化:

RowLayout {
    id: layout
    anchors.fill: parent

Layout的大小限制可用来限制其父元素window的大小。 你可以从Layout中获取大小约束,并在Window元素的minimumWidth,minimumHeight,maximumWidth和maximumHeight上设置这些约束。 以下代码确保了window的大小不能超出Layout的限制:

minimumWidth: layout.Layout.minimumWidth
minimumHeight: layout.Layout.minimumHeight
maximumWidth: 1000
maximumHeight: layout.Layout.maximumHeight

注意:由于在这个场景下layout.Layout.maximumWidth是无限的,因此我们不能将其绑定到Window的maximumWidth属性。它需要绑定一个整数, 因此,我们将固定的最大宽度设置为1000。

最后,你通常希望窗口的初始大小为布局的隐式大小:

width: layout.implicitWidth
height: layout.implicitHeight

以上文章参考自Qt官方文档: https://doc.qt.io/qt-5/qtquicklayouts-overview.html
依个人理解, 简要翻译, 如有错漏, 欢迎指正.



以上是关于QML布局概述(Qt Quick Layouts Overview)的主要内容,如果未能解决你的问题,请参考以下文章

Qml Qt Quick Control 2:Text和ComboBox的字体大小区别

Qt QML列表视图布局不调整大小

Qt和Qt Quick QML,

qt-quick(qml) 应用程序无法订阅 ros 主题

✿4-The Basics-Qt Quick and QML

Qt Quick——QML基础:自定义控件