【无标题】QML中的anchors和Layout布局的使用

本文探讨了QML中Layout和Anchors的区别与应用,讲述了如何在不同层级利用它们进行界面元素布局和定位。重点在于理解两者的关系:Layout用于管理整体区域内的布局,Anchors则用于直接操作子元素的相对位置。实例展示了如何混合使用这两种技术以实现复杂界面布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QML中的anchors和Layout布局的使用

关于布局和锚点,在wpf的时候没有碰到这些问题,在QML中,一直有些恍惚。做一个界面,忽然有一点领悟,不知道是不是对的。

布局管理器

是在一个范围内划定多个区域,这个区域可以跟随页面的改变而改变,其内部一级的器件,需要按照布局的方式进行对位置参数的设定,即以Layout开头的配置。

锚点

是在一个范围内直接操作排列,也可以实现布局管理器的功能,麻烦一些,但是反过来是不行的。

            Button{
                text: qsTr("参数配置")
                font.pointSize: 24
                font.bold: true
                Layout.preferredWidth:200
                Layout.preferredHeight: 80
            }
            Rectangle{
                Layout.fillHeight: true
                Layout.preferredWidth: 200

                Image {
                    id: logo
                    width: 100
                    height:  100
                    source: "qrc:/img/img/jw_logo_2.png"
                    fillMode: Image.PreserveAspectFit
                    clip: true
                    anchors.bottom: parent.bottom
                    anchors.left: parent.left
                    anchors.right: parent.right
                }
            }
最重要的一点:

两者是混用的,是在不同情况下使用,比如在RowLayout下放置Rectangle,对RowLayout的位置设定是需要使用锚的方式的,因为它的外层没有Layout;对Rectangle需要使用布局的方式,如Layout.fillHeight等,这对应的是内部第一级的;如果在Rectangle中再有一个Image,其位置则是对应于Rectangle,而不是再外层的Layout,所以使用anchors的方式。

我以为在最内层的Image上也是需要使用Layout的,但是折腾了一晚上再加一早上,没能实现,使用anchors可以了,回头再想,在wpf中,也是这样的。

image-20220906092752928

### QML 中 ColumnLayout使用方法 在 QML 中,`ColumnLayout` 是一种布局元素,用于在垂直列中排列其子项。这种布局方式非常适合创建按顺序自上而下排列的界面组件。 #### 创建基本的 `ColumnLayout` 要定义一个简单的 `ColumnLayout`,可以按照如下方式进行: ```qml import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 ApplicationWindow { visible: true width: 640 height: 480 ColumnLayout { Button { text: "Button One" Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter } Rectangle { color: "lightblue" implicitHeight: 50; implicitWidth: 200 Text { anchors.centerIn: parent text: "Rectangle Two" } } Label { text: "Label Three" font.bold: true } } } ``` 上述代码展示了如何在一个窗口内通过 `ColumnLayout` 将三个不同类型的控件(按钮、矩形区域以及标签)依次沿竖直方向堆叠起来[^2]。 #### 调整子项目大小与间距 为了更好地控制各个项目的尺寸间隔,在 `ColumnLayout` 下还可以利用一些特定于布局系统的附加属性来调整这些参数。例如设置最小宽度 (`minimumWidth`) 或者高度(`minimumHeight`) 来确保即使内容较少也能保持一定的空间占用;也可以设定间距 (`spacing`) 属性改变相邻两项之间的距离。 ```qml // 设置整个布局内的默认间距为20像素 ColumnLayout { spacing: 20 // ...其他子元素... Item { Layout.preferredWidth: 300; Layout.minimumHeight: 100; // 子元素的具体实现... } } ``` 此段代码说明了怎样给定全局性的间距值,并且针对某个具体的子对象指定了推荐使用的宽度及最低限度的高度限制。 #### 动态适应屏幕变化 当涉及到响应式设计时,即希望应用能够根据不同设备或视窗大小自动调整显示效果,则可以通过绑定表达式的方式让某些属性随父容器的变化而相应变动。比如下面的例子就实现了根据可用高度动态计算各部分所占比例的效果。 ```qml Item { id: container anchors.fill: parent ColumnLayout { anchors.fill: parent Repeater { model: ["Header", "Content Area", "Footer"] delegate: Rectangle { color: index % 2 ? "#eee" : "#ddd"; Text { anchors.centerIn: parent text: modelData } Layout.fillWidth: true // 根据索引分配不同的相对高度 Layout.preferredHeight: (container.height / 3) * ((index == 1)? 2 : 1); } } } } ``` 这段代码片段展示了一个由三部分组成的页面结构——头部、主体区服务端脚部,其中中间的内容区域占据了总高的三分之二,其余两部分则平分剩余的空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值