QT- QML Layout+anchors 布局+锚点实现窗口部件权重比例分配

QML TableView表格自定义指南:从Model到Delegate的完整实现 在Qt Quick开发中,表格是数据展示的常见需求,而TableView以其独立的行列坐标体系、懒加载与委托复用机制,成为实现复杂表格的首选方案。理解Model与Delegate的分工,是自定义表格的基础:Model负责提供数据与行列结构,Delegate则决定每个单元格的视觉表现与交互逻辑。通过合理设计columnWidthProvider与rowHeightProvider,可以精确控制列宽与行高,配合HorizontalHeaderView或手动表头实现专业的表头效果。固定首列、拖拽列宽、自定义滚动条 阅读详情

在日常打螺丝中,我们偶尔会需要实现界面各组件能按比例放置,自适应各种分辨率的需求。我用锚点和布局都实现过相关界面,记录下来两种方式实现的差异。跟大家一起学习。

简单比较两种界面管理

特性布局系统锚点系统
排列方式自动流式布局精确相对定位
比例控制内置权重分配机制需手动计算百分比
嵌套复杂度适合多层嵌套结构适合扁平化结构
动态调整自动响应容器尺寸变化需绑定尺寸信号
典型应用表单布局/工具栏/等间距排列悬浮元素/固定边栏/叠加层

锚点、排列的简单介绍

这两者并不是严格分开使用,经常会混用,比如有时候用锚点分区域,然后用Layout布局控制里面的细节,或者用Layout 控制布局,里面用anchors控制小细节。


锚点布局实现比例布局

QML锚点系统(anchors)提供基于相对关系的布局方式,通过元素间的空间关系实现精准定位。比较直观,使用起来很方便。
常用接口:

  • anchors.left: parent.right ,本组件的左边是父组件的左边,相对定位设置 ,还有right 、top 、bottom等
  • anchors.centerIn: parent ,在父组件里正中央 居中
  • anchors.margins:30, 整体边距控制 或单独设置topMargin,bottomMargin,leftMargin,rightMargin
  • anchors.horizontalCenter: parent.horizontalCenter, 相对父组件水平居中
  • anchors.verticalCenter parent.verticalCenter, 相对父组件垂直居中

实现没有什么约束(或者是我目前的场景没有遇到), 直接根据相对比例,计算即可。一般这样的话,根组件(或者依赖的父组件)要确定好大小,或者成为子组件。

property int ratio : 0.2 // 可以独立成属性,方便修改管理

Item {
    id: container
    width: 400; height: 300
    
    Rectangle {  // 标题(20%)
        id: header
        color: "lightgreen"
        anchors {
            top: parent.top
            left: parent.left
            right: parent.right
        }
        height: container.height * ratio 
    }
    
    Rectangle {  // 内容(80%)
        color: "lavender"
        anchors {
            top: header.bottom
            bottom: parent.bottom
            left: parent.left
            right: parent.right
        }
        height: container.height * (1-ratio )
    }
}

布局管理实现比例布局

所有用布局管理器(如 RowLayout、ColumnLayout)管理的组件都会自动拥有Layout.xxxx 相关的属性,可以设置它们来控制布局实现。
常用接口:

  • Layout.alignment: Qt.AlignTop, 控制对齐方式, 有水平居中Qt.AlignHCenter 左对齐Qt.AlignLeft 等
  • Layout.fillWidth: true, 控制是否填满宽度,高度是fillHeight
  • Layout.margins: 16 ,整体边距控制 或单独设置leftMargin / topMargin等
  • Layout.preferredWidth: 50, 设定首选宽度是50, minimumHeight是最小

QT 在Qt 6.2+里提供了一个更直观的比例分配属性 Layout.weight。它不需要手动设置fillXXX,直接在兄弟组件之间设定即可。
但目前(2025年)Qt 5.6.3+ 商用还是会收费,所以本文推荐的做法在 Qt 5.x 和 QtQuick.Layouts 1.x 中是可用的。

用Layout布局管理实现比例分配有三个要点:

  • 按比例分配:同时设置 Layout.fillxxx: true 和 Layout.preferredxxx,这样布局里的组件在分配阶段会以preferredxxx作为比例因子,在分辨率变时组件相对大小保持不变。
  • 固定像素:仅设置 Layout.preferredxxxx(不设置 fillxxxx)就会变成按给定的值固定属性
  • 避免循环依赖:不要直接绑定 parent.width 或 parent.height,而是通过布局系统的内置机制实现自适应。

叽里呱啦说啥呢,怎么用?要注意啥? 好吧,给举两个例子就明白了:

一,正确按比例分配(低于Qt 6.2) : 
两个chilstool会按照 8:2 的比例分配,且在窗口分辨率变化的情况下,比例依然不变:
如果想进一步细致控制,加大就行: 78 : 22,只需保证所有子项加起来 =1、=10 或者 =100能整除的就行

ColumnLayout
{
    anchors.fill: parent
    
    Rectangle
    {  // 标题(20%)
        color: "white"
        Layout.fillWidth: true
        Layout.fillHeight: true
        Layout.preferredHeight: 2  //0.2也行 比例系数 2 / (2+8) 
		/******/
    }
    
    Rectangle
    {  // 内容(80%)
        color: "white"
        Layout.fillWidth: true
        Layout.fillHeight: true
        Layout.preferredHeight: 8  //0.8也行 比例系数 8 / (2+8)
   		/******/
    }
}


二,布局的循环分配 : 
父引用子,子引用父,导致计算出错:
这个其实算是我踩的坑,还以为和锚点一样的用法,被fillxxxx字面意义带偏了。记录一下

ColumnLayout {
    anchors.fill: parent

    RowLayout {
        id: childlayout
        Layout.fillHeight: true 
        Layout.fillWidth: true  // 会先考虑子控件的宽

       Rectangle {
           id: chilstool
           Layout.fillHeight: true
           Layout.preferredWidth: parent.width * 0.8 // 又依赖父控件的宽

           color: "#ffffff"
       }

       Rectangle {
           id: chilstool2
           Layout.fillHeight: true
           Layout.preferredWidth: parent.width * 0.2

           color: "#ffffff"
       }
    }
 }


循环依赖问题简谈

QML 的布局系统在计算尺寸时遵循以下步骤:

父布局管理器 子布局组件 子项目 这段fillXXX 不参与,隐式计算为共有 1. 收集尺寸提示 查询 implicitWidth/Height 返回隐式尺寸 报告自身尺寸需求 2. 计算布局分配 按优先级处理: Minimum > Preferred > Maximum fillXXX 就发生在这个阶段 3. 分配最终尺寸 4. 设置子项目几何 5. 子项目内部布局 6. 布局完成信号 父布局管理器 子布局组件 子项目

fillWidth/fillHeight 并不发生在隐式尺寸计算阶段。它类似给父控件声明“我不知道我尺寸如何,但我要占用你剩下的空间” 。 所以在隐式尺寸计算阶段,它的尺寸是未确定的,而在隐式尺寸计算阶段,又需要获知子控件的尺寸,若此时子控件又依赖父控件的尺寸,QML尺寸计算就会陷入循环依赖,引发了错误。
从分析上能获知,想破坏循环依赖,其实就是确定好子控件或父控件的尺寸,或者正确设定比例权重分配,打破循环。

  • 所以日常打螺丝中,注意布局管理器下的fillxxx 和子项的 parent.width * 0.8不能一起出现即可。

QtQuick QML教程(5):qml锚布局anchors的用法介绍 QML的布局方法是anchors,锚。 例如界面上四个按钮,可以用绝对坐标 (x, y) 设置他们的位置, 代码如下: import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.5 Window { visible: true width: 320 height: 48... 阅读详情

相关推荐

QML基础类型:尺寸

在上面的例子中,我们创建了一个宽度为200,高度为100的矩形,并在其中嵌套了三个子矩形,分别使用了不同的尺寸设置方法。其中,第一个矩形使用了普通的像素单位来设置宽高,第二个矩形使用了pt单位,第三个矩形则使用了百分比单位。除了宽高之外,尺寸类型还可以用于其他的属性设置,如字体大小、边框宽度等。总之,在QML中,尺寸类型是一个非常常用的基础类型,掌握好它的使用方法,对于构建漂亮而又自适应的UI界面非常有帮助。需要注意的是,使用百分比作为尺寸时,父元素的宽高必须是已知的,否则会出现尺寸计算错误的情况。

BitLordX的博客 542

QT Quick QML入门笔记(四)锚(anchors)布局

上一章笔记链接: QT Quick QML入门笔记(三)常见元素 目录1. 布局介绍2. 锚(anchors) 布局3. 代码实例4. 运行 1. 布局介绍 对QT Quick布局一般有四种形式, ①. 绝对坐标:x、y、z、width、height、 ②. 锚(anchors) 布局 ③. 定位器(Row、Column、Grid、Flow) ④. 布局管理器(GridLayout、RowLayo...

火山上的企鹅 5535

从HSPICE到Spectre:手把手教你搞定不同SPICE仿真器的网表转换(附避坑指南)

本文详细介绍了从HSPICE到Spectre的SPICE仿真器网表转换方法,包括核心语法差异、分步转换流程和常见问题排查。通过实战案例和避坑指南,帮助工程师高效解决不同SPICE仿真器间的兼容性问题,提升集成电路设计效率。

weixin_29745609的博客 368

QML 自适应布局 关键

QML 自适应布局 关键

huangmindong的专栏 979

NOAA气象数据下载攻略

各方搜寻气象数据下载途径,发现网上最多的就是从NOAA下载,但是中途有尝试过很多次都没有下载到,每次都是显示不可用,今天终于下载成功了,特此记录。 首先我是从这个网址进入的:National Centers for Environmental Information (NCEI) formerly known as National Climatic Data Center (NCDC) | NCEI offers access to the most significant archives of oc

lianqian66的博客 3万+

告别配置烦恼!保姆级教程:在Windows 10/11上为QT5.14.2配置MSVC2017编译器(附VS2022组件避坑指南)

本文提供了一份详细的保姆级教程,指导如何在Windows 10/11上为QT5.14.2配置MSVC2017编译器,包括VS2022组件避坑指南。从环境准备到关键配置,再到调试工具验证和Qt Creator中的编译器设置,一步步解决常见问题,帮助开发者快速搭建稳定可靠的开发环境。

weixin_30615767的博客 502

【QT Quick】页面布局:锚点定位(Anchors)

锚点(anchors)布局是 QT Quick 中一个用于控制元素位置和尺寸的非常重要且常用的布局方法。通过使用锚点,可以轻松地将组件与父组件或其他兄弟组件进行相对位置绑定。锚点布局的关键优势在于其动态性,能够根据父容器大小自动调整元素的位置和尺寸,从而适应不同屏幕分辨率和窗口大小。

2303_80346267的博客 1453

SoC低功耗设计实战:28nm工艺下四核A7的Hierarchical Flow全流程解析

本文深入解析了在TSMC 28nm工艺上,采用Hierarchical Flow(层次化流程)实现四核Cortex-A7 SoC低功耗设计的全流程。文章从项目背景切入,详细探讨了基于UPF的电源规划、时钟树综合、接口时序收敛以及物理验证等关键环节,分享了使用Cadence Innovus等工具进行低功耗物理实现的实战经验与挑战。

weixin_29231263的博客 323

QML布局全指南:从Anchors到Layout的自适应方案

界面布局是UI开发中最基础也最关键的环节之一,尤其是在跨分辨率、动态内容的场景下,布局策略直接决定程序的稳定性与维护成本。QML作为Qt Quick的声明式语言,提供了定位器(Positioner)、锚定(Anchors)和布局管理器(Layout)三套核心机制,分别适用于固定结构、复杂关系与自适应伸缩。理解它们的原理和适用边界,是构建流畅、健壮界面的前提。从简单的Row、Column到功能强大的ColumnLayout、GridLayout,从fillWidth的伸缩逻辑到implicitHeight的尺

weixin_33750664的博客 211

[特殊字符]用Python爬取中国裁判文书网案例信息:从爬虫到数据可视化全流程实战(附代码)

✅ 分析裁判文书网的网页结构;✅ 自动化爬取案件信息;✅ 解析加密参数并获取数据;✅ 数据可视化图表输出;✅ 模块化构建爬虫系统。

2201_76125261的博客 2824

运行时安全引擎RSE

该博客重点介绍了运行时安全引擎(Runtime Security Engine,简称 RSE)与应用处理器(Application Processor,简称 AP)之间的关系。 根据 ARM 的参考设计,RSE 是位于同一芯片(die)上的一个独立核心,与 AP 和系统控制处理器(System Control Processor,简称 SCP)并列存在。RSE 为整个系统提供基本的安全保障和运行时服务,例如:可信启动(trusted boot)、度量启动(measured boot)、平台认证(platf

AI-安全-功耗 1364

【QML】锚布局

锚布局

Cain Xcy的博客 961

蓝牙攻防实战:蓝牙技术详解

蓝牙作为轻量级、低功耗的无线通信技术,其设计兼顾了效率与灵活性,但也留下了诸多安全隐患。随着物联网设备的爆发式增长,蓝牙的攻击面也在不断扩大。理解其底层通信机制、协议栈结构以及配对加密逻辑,是提升无线安全防护能力的关键。

idlecloud0105的博客 739

qml中使用Anchors布局及问题排查

QML中使用anchors(锚点)进行动态布局,以及问题分析

liangyunshan123的博客 1909

基于STM32的六足机器人控制系统设计(项目资料ID:27)

六足机器人控制系统综合分析其结构、步态与控制算法,融合云端服务、Wi-Fi、蓝牙、语音识别及手势识别等多种技术,设计了多元化控制模式,并针对不同应用场景提出了差异化的构建方案。系统硬件采用分层设计,分为主控板与舵机控制板:主控板以 STM32F103VET6 为核心,负责各类控制模式的数据处理与状态显示;舵机控制板采用 STM32F103R8T6,专注于舵机角度的精确控制,两板通过串口实现数据交互。

以培养嵌入式工程师为己任 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

QML (控件位置布局)之(Anchors)锚布局

qml 锚布局介绍

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1784

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

QML界面自适应

方案一:首先做出来界面,然后在不同的分辨率下调整一套qml文件并用文件夹管理,最后根据不同的分辨率来加载不同文件夹中的文件。目前采用方案三,虽然麻烦一些,不管在800*600的小屏幕分辨率到1920*1080下的都适应的还不错。每个界面中只要是使用到锚定位topMargin, bottomMargin, leftMargin, rightMargin都乘以对应的缩放因子进行绑定。如果屏幕分辨率大于设置的最大分辨率,就只拉伸背景窗体。如果屏幕分辨率小于设置的最小的分辨率,就出现滚动条;

weixin_46880240的博客 3108

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

QT应用程序分辨率自适应

QT应用程序分辨率自适应一、应用程序分辨率自适应    为了满足应用程序能在不同尺寸及分辨率的屏幕下能够正常的运行显示,就需要对不同的分辨率进行自适应,而且应用程序分辨率自适应的问题在应用UI设计布局以及UI代码编写阶段进行设计规划,如在界面完成后期再考虑分辨率问题可能需要更大的工作量,并且自适应效果不一定能达到要求。一般来说,应用程序的设计应该按照支持的最小分辨率来进行设计,在应用程序分辨率变化时

matengxiao的博客 6万+

Roson讲Qt#16 QML中的anchors(锚)

QML中有一个数据类型叫Item,Item里面有很多属性,其中一个就是anchors. anchors翻译过来叫“锚”,锚可能不好理解,在我看来,可以把anchors当成是一个控件浓缩而成的一个点,可以通过设置点的上下左右等属性来控制界面外观,控制项与项之间的关系。 下面这个例子设置了: 以pic的水平方向上的中心作为lable的水平方向的中心 以pic的底部边框作为lable的上方边框 在label的上方设置5个像素的边距 下面这个例子设置了: 以pic的水平方向上的中心作为la

Allen Roson 1485

【QML 定位布局】锚布局

【QML 定位布局】锚布局

m0_60259116的博客 336

qml 布局管理:anchors Row Column Grid Flow RowLayout ColumnLayout GridLayout StackLayout

锚布局anchors 锚点锚线:left, horizontalCenter, right, top, verticalCenter, baseline, bottom baseline的作用和top一致 锚定方式: anchors.fill:使一个元素填充到另一个元素,即同时指定上下左右四个锚点 anchors.centerIn:将一个元素放到另一个元素中心,即指定了水平中心和垂直中心 四个边界的边距 anchors.margins:同时指定四个边界的边距 leftMargin, rightMar

qq_33373173的博客 2035

QT之QML布局总结

QT之QML布局总结 锚定位 RowLayout(行布局管理器) ColumnLayout(列布局管理器) GridLayout(网格布局管理器) 其他:弹簧功能

热土程序园,利他愉己~ 2222

java gridlayout 权重_QML布局:如何为行或列布局中的项目赋予权重?

我试图通过为每个项目指定一种权重来找出按比例布局项目的方法 . 例如Android的方式layouts .我试图实现它的方式是这样的:import QtQuick 2.10import QtQuick.Controls 2.3import QtQuick.Layouts 1.3GridLayout {columns: 4width: 640height: 480Rectangle {color: ...

weixin_33628677的博客 313

QML 中的屏幕适配问题

QML 中的屏幕适配问题

qyvlik的专栏 1万+

qml之锚点Anchors

QML 中的锚点(Anchors)是一种声明式的布局系统,它允许你定义 UI 元素之间的相对位置关系,而不是使用绝对坐标定位。

深之JohnChen的专栏 1215
上一篇: Qt QML - qmldir使用方法详解
温柔大猩猩
博客等级 码龄7年 65粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值