【Qt6 QML Book 基础】06:QML 定位元素

引言

在 QML 界面开发中,元素的布局与定位是构建高效、美观 UI 的核心基础。Qt Quick 提供了一套灵活的布局系统,通过 Column/Row/Grid 等定位器(Positioners)以及 Repeater 动态生成组件,开发者能够快速实现从简单线性排列到复杂网格布局的多种场景。本文结合官方示例与实战代码,详细解析 QML 布局系统的核心机制,涵盖基础布局、网格系统、流式布局、动态生成等核心功能,并提供完整可运行工程,助力开发者掌握规范化布局开发思维。

一、运行效果图

本文示例程序运行后呈现以下效果:

二、基础定位器:线性布局的核心应用

1. 垂直布局 Column

核心特性

  • 子元素垂直堆叠,通过 spacing 控制垂直间距
  • 自动分配空间:未指定尺寸的子元素可通过 Layout.fillHeight 填充剩余空间
  • 典型场景:菜单列表、表单输入框垂直排列

完整代码(ColumnExample.qml)

import QtQuick  
DarkSquare {  // 深灰色背景容器(自定义组件,48x48px,深灰色边框)  
    id: root  
    Column {  // 垂直布局容器  
        anchors.centerIn: parent  // 居中显示  
        spacing: 12  // 子元素间距12px  
        // 红色正方形(自定义组件,48x48px,橙色边框)  
        RedSquare { }  
        // 绿色正方形(宽度96px,高度48px,绿色边框)  
        GreenSquare { width: 96 }  
        // 蓝色正方形(默认48x48px,蓝色边框)  
        BlueSquare { }  
    }  
}  

关键属性解析

属性说明
spacing子元素垂直间距,单位像素(px),默认 0
Layout.alignment子元素水平对齐方式(如 Qt.AlignHCenter、Qt.AlignRight)
clip是否裁剪超出容器的子元素,默认false

2. 水平布局 Row

动态宽度最佳实践

import QtQuick  
BrightSquare {  // 浅灰色背景容器(自定义组件,动态计算尺寸)  
    id: root  
    // 容器宽度=子元素总宽度+左右边距,高度=子元素总高度+上下边距  
    width: row.childrenRect.width + 2*margins  
    height: row.childrenRect.height + 2*margins  
    property int margins: 20  // 统一边距参数化  
    Row {  // 水平布局容器  
        id: row  
        anchors.fill: parent  // 填充父容器  
        anchors.margins: root.margins  // 应用边距  
        spacing: root.margins/2  // 间距为边距的一半(10px)  
        // 三个红色正方形,间距10px,边距20px  
        RedSquare { }  
        RedSquare { }  
        RedSquare { }  
    }  
}  

布局方向控制

  • layoutDirection 属性支持 LeftToRight(默认)、RightToLeft,适配阿拉伯语等右向语言界面

三、结构化布局:网格与流式布局进阶

3. 网格布局 Grid

固定网格 vs 动态网格

// 固定2x2网格(`GridExample.qml`)  
Grid {  
    rows: 2          // 2行  
    columns: 2       // 2列  
    spacing: 8       // 行列间距8px  
    RedSquare { }    // 第1行第1列  
    RedSquare { }    // 第1行第2列  
    RedSquare { }    // 第2行第1列  
    RedSquare { }    // 第2行第2列  
}  

// 动态12列网格系统(`GridsystemExample.qml`)  
Grid {  
    columns: 12                  // 12列响应式网格  
    spacing: 12                  // 列间距12px  
    Repeater {  
        model: columns * rows     // 生成12列×8行=96个子元素  
        delegate: RedSquare {  
            width: cellWidth      // 单元格宽度=64px(通过父容器计算)  
            height: cellHeight    // 单元格高度=64px  
        }  
    }  
}  

网格填充方向

  • flow 属性支持 TopToBottom(默认逐行填充)、LeftToRight(逐列填充),满足不同布局需求

4. 流式布局 Flow

自适应换行实现

Flow {  
    anchors.fill: parent        // 填充父容器  
    anchors.margins: 20        // 20px边距  
    spacing: 20                // 元素间距20px  
    // 子元素超出容器宽度时自动换行  
    RedSquare { }  
    BlueSquare { }  
    GreenSquare { }  
    RedSquare { }  
    BlueSquare { }  
    GreenSquare { }  
}  

应用场景

  • 标签云:标签数量不确定时自动换行
  • 图片列表:不同尺寸图片混合排列,按流向自动布局

四、动态布局:Repeater 高效生成子元素

5. 数据驱动布局示例(RepeaterExample.qml)

DarkSquare {  
    id: root  
    width: 320; height: 320  
    property variant colorArray: ["#00bde3", "#67c111", "#ea7025"]  // 预设颜色库  
    Grid {  
        anchors.fill: parent  
        spacing: 4  // 网格间距4px  
        Repeater {  
            model: 16  // 生成16个子元素(4x4网格)  
            delegate: Rectangle {  
                required property int index  // 显式声明索引,避免隐式依赖  
                property int colorIndex: Math.floor(Math.random()*3)  // 随机颜色索引  
                width: 56; height: 56  // 子元素尺寸  
                color: root.colorArray[colorIndex]  // 应用随机颜色  
                border.color: Qt.lighter(color)  // 亮色边框  
                // 居中显示序号(中文标签)  
                Text {  
                    anchors.centerIn: parent  
                    color: "#f0f0f0"  
                    text: "格子 " + (index + 1)  
                }  
            }  
        }  
    }  
}  

性能优化建议

  • 小数据量:直接使用 Repeater 配合固定模型
  • 大数据量:改用 ListView/GridView 并结合 Loader 延迟加载,避免内存占用过高

五、复合布局:混合使用多种定位器

6. 典型分层布局(mixed.qml)

Column {  // 外层垂直布局(头部-主体-尾部结构)  
    width: 240; height: 120  
    // 顶部栏:绿色色块,高度占比20%  
    GreenSquare {  
        height: parent.height*0.2  
        width: parent.width  // 撑满父容器宽度  
    }  
    // 主体层:水平布局,两个蓝色色块分别占40%和60%宽度  
    Row {  
        height: parent.height*0.6  // 高度占比60%  
        width: parent.width  
        BlueSquare {  
            width: parent.width*0.4  // 左半部分40%  
            height: parent.height  // 撑满父容器高度  
        }  
        BlueSquare {  
            width: parent.width*0.6  // 右半部分60%  
            height: parent.height  
        }  
    }  
    // 底部栏:绿色色块,高度占比20%  
    GreenSquare {  
        height: parent.height*0.2  
        width: parent.width  
    }  
}  

设计思路

  • 层级分离:通过垂直布局划分页面结构,内部嵌套水平布局实现区域细分
  • 百分比布局:使用 parent.width/height 实现响应式设计,适配不同屏幕尺寸

六、原始定位:手动坐标控制

7. 精确位置布局(RawRowExample.qml)

BrightSquare {  
    id: root  
    width: 224; height: 88  
    // 手动指定三个红色正方形的坐标(左上角定位)  
    RedSquare { x: 20; y: 20 }  
    RedSquare { x: 88; y: 20 }  // 间距68px(88-20)  
    RedSquare { x: 156; y: 20 }  
}  

适用场景

  • 极简界面:少量元素需要精确像素级定位
  • 游戏开发:动态物体的坐标实时计算与更新

七、布局系统最佳实践

1. 自定义组件封装

// 统一颜色块组件(48x48px,带边框)  
// RedSquare.qml  
Rectangle {  
    width: 48; height: 48  
    color: "#ea7025"  
    border.color: Qt.lighter(color)  // 亮色边框提升视觉层次  
}  
  • 优势:减少重复代码,统一视觉规范,方便后续修改样式

2. 参数化设计原则

// 将边距、间距等常用值定义为属性  
property int margins: 20  
property int spacing: margins/2  
  • 好处:全局修改一处即可影响所有相关布局,提升维护效率

3. 响应式设计技巧

  • 使用 anchors 布局:通过 fill/centerIn/margins 实现元素自适应
  • 结合 Layout 附加属性:
    Column {  
        Label { text: "标题"; Layout.fillWidth: true }  // 撑满父容器宽度  
    }  
    

八、常见问题与解决方案

Repeater 性能瓶颈

  • 现象:数据量较大时界面卡顿
  • 解决:改用 ListView 并设置 itemHeight/itemWidth,启用 deferredLoading

九、总结

  • 布局体系全覆盖:掌握线性布局、网格系统、流式布局、动态生成等核心能力
  • 工程化实践:通过自定义组件、参数化设计提升代码复用性与可维护性
  • 响应式设计:学会使用百分比、锚定布局适配不同屏幕尺寸

QML元素的布局和定位 QML有三种布局定位的方式分别为定位器(Item Positioner)、布局管理器(Item Layout)、锚定位(anchor)。锚定位在之前的内容中已经介绍过了,主要用于元素之间相对位置的锚定。这里主要介绍一下定位器和布局管理器。 阅读详情

相关推荐

QML 的定位方式:手动定位、绑定定位、锚定位、定位器与布局定位器

QML 提供的定位方法可以让你精准控制元素的位置和尺寸。手动定位:通过设置元素的x和y属性来手动调整位置。绑定定位:通过数据绑定的方式将元素的位置与其他元素或属性关联。锚定位:利用锚点系统通过与父元素或其他元素的关系来定位子元素。定位器:使用 QML 中的布局元素(如RowLayoutGridLayout等)来实现元素的自动定位。下面将逐一介绍每种定位方法的原理、优缺点及适用场景。手动定位:简单直接,适合精确控制位置的场景,但不适应动态变化。绑定定位。

m0_62599305的博客 608

QML基本元素介绍

目录 基本元素 基础二元素对象(Item Element) 矩形框元素(Rectangle Element) 基本元素 qml中元素可以分为可视化元素和非可视化元素。可视化元素(例如Rectangle)有着几何形状,并且可以显示在屏幕上。非可视化元素(例如Timer)提供了常用功能,通常用于操作可视化元素。 本文主要介绍一下集中基础的可视化元素:Item(基础元素对象)、Rectangle(矩形框)、Text(文本)、Image(图像)...

风起时~微凉的博客 905

QtQuick QML教程(7):QML元素定位器:Row、Colum、Grid、Flow、定位器嵌套以及Repeater用法

是的,model是Repeater的一个属性。这个属性定义了Repeater应该重复的数据模型。一个数字,表示要重复的次数。一个列表模型,如ListModel。一个数组,如。其他 QML 数据模型,如等。在给出的示例中,model属性被设置为一个字符串数组,这意味着Repeater将为数组中的每个字符串创建一个组件实例。在这种情况下,你可以使用modelData属性来访问当前条目的数据。

琅嬛福地 1213

qml基本元素使用

Item作为基本元素,没有视觉外观,属性较多,且较多控件继承它,因此,弄懂Item属性、接口、用法是学习qml关键。QtObject通常会被用来封装一些重要的属性和方法,并且可以被包含在JS脚本中进行使用。在qml中,元素可以被分为以下几大类。

狗蛋的博客 602

QML基本元素和属性

任何知识,都有自己的体系架构,掌握了体系架构,按图索骥的去学习的效率要远高于漫无目的的学习。这里我参照QML的知识框架和一些问题来对QML进行系统的总结。问题列表如下: 1.QML是什么? 2.为什么使用QML? 3.QML的基本语法? 4.QML的元素都有哪些? 1.QML是什么? QML是Qt推出的Qt Quick技术的一部分,是一种用于描述用户界面的类似html的声明式语言。它将用户界面分解成一些更小的元素,这些元素能够结合成一个组件。这点类似于json结构,每个对象既有自己的行为和属性同

yang1fei2的博客 9572

qt quick 下qml的定位器(在qt5.0以上版本测试)

QML 提供了很多用于定位的元素。这些元素叫做定位器,都包含在 QtQuick 模块。这些定位器主要有 Row、Column、Grid和Flow等。

qml元素详解

QML是一种描述用户界面的声明式语言,它将用户界面分解成一些更小的元素,或者说是由一个个元素堆积、结合成一个组件。QML语言不仅需要描述了用户界面的形状,还需要描述其行为。

weixin_42887343的博客 1685

保姆级!n8n 公众号自动化:从 0 搭 “写文案 + 生图 + 发草稿” 全流程

【摘要】本文介绍如何利用n8n搭建全自动公众号内容发布流程,涵盖AI文案生成、封面图制作到自动发布的全链路解决方案。通过对接OpenRouter大模型、阿里云百炼生图API及微信官方接口,实现从内容创作到发布的自动化。重点包括:1)n8n微信节点安装配置;2)大模型API授权与提示词优化技巧;3)图片生成与格式转换处理;4)公众号接口授权注意事项;5)草稿自动生成参数设置要点。特别提醒首次配置时需关闭自动发布功能以检查效果,避免格式错误导致发布失败。该方案无需复杂编程,适合运营人员快速搭建自动化内容生产流程

Jacket0603的博客 1594

QML 基本元素

元素可以被分为与。一个可视化元素(例如矩形框 Rectangle)有着几何形状并且可以在屏幕上显示。一个非可视化元素(例如计时器 Timer)提供了常用的功能,通常用于操作可视化元素。现在我们将专注于几个基础的可视化元素,例如 Item(基本项元素),Rectangle(矩形框),Text(文本),Image(图像)和 MouseArea(鼠标区域)。

m0_73482095的博客 191

图形学基础知识:着色(三)Rendering Pipeline与Shader

管线(Pipeline) 什么是管线? 管线我们可以理解为流水线,流水线大家都懂,就是工厂里面生产东西的一整套流程。例如饮料厂要生产饮料,需要洗瓶子,倒饮料,加盖,包装等等,这一整套过程就是流水线。那么我们要把一个三维场景渲染成一幅二维的图像,同样需要一个先干嘛再干嘛然后干嘛最后干嘛的过程,这个过程或流水线,我们就称之为管线。 实时渲染管线(Real-time Rendering Pipeline) 通过前面几篇的学习,我们知道了要把一个三维场景渲染成一幅二维的图像大致分为以下几个步骤: M.

王王王渣渣的博客 2532

跟着团子学SAP CO:基于成本的完工百分比结算:Cost-based POC(以项目为例)

本文以英国及北美会计准则下的基于成本的POC的销售型项目结算对PS模块中的完工百分比进行介绍

Lucas1211的博客 2万+

QML与Qt Quick深度解析:从声明式UI到跨平台应用开发的终极指南

在当今多平台应用开发的时代,Qt Quick技术栈凭借其独特的声明式UI编程模型,正在重新定义现代应用程序的开发范式。QML(Qt Meta-Object Language)作为Qt Quick的核心,提供了一种直观、高效的方式来构建流畅的用户界面,同时保持与C++后端的无缝集成。本文将带你深入探索QML的完整生态系统,从基础概念到高级应用场景,揭示这一技术如何改变开发者构建跨平台应用的方式。

gitblog_00245的博客 662

【GAN实战】基于pytorch-CycleGAN与pix2pix的自定义数据集训练全攻略

本文详细解析了基于PyTorch的CycleGAN与pix2pix模型在自定义数据集上的完整训练流程。核心在于根据数据是否成对来正确选择模型:pix2pix适用于严格配对的“孪生”数据,而CycleGAN则擅长处理非配对的“散装”数据集。文章从数据准备、配置训练到测试应用,提供了全链路实战指南与关键参数调优心得,帮助开发者高效实现图像到图像的风格转换。

x2y3z4a5b的博客 704

QMl编程知识——QML元素布局详解

在Qt Quick中,QML(Qt Modeling Language)提供了一种灵活且强大的方式来构建用户界面。其中,锚布局(Anchors)是QML中一种非常重要的布局方式,它允许我们通过指定元素与其他元素之间的关系来确定元素在界面中的位置。除了锚布局(Anchors)之外,还有多种常用的布局方式(Row/行布局、Column/列布局、Grid/网格布局、Flow/流布局),这些布局方式可以根据不同的需求和场景来选择使用。本文将详细介绍QML布局的基本概念、使用方法和一些实际案例。

J^T的博客 3822

【DRAM存储器十五】DDR介绍-关键技术之DLL和prefetch

详述DDR DLL和预取原理以及几个DDR相对初代SDRAM新增的时序参数

highman110的博客 4368

跨平台也要跑得像原生一样顺:SAP GUI for Java 的安装、配置、运维与自动化实战

摘要:SAP GUI for Java 作为跨平台客户端解决方案,在 S/4HANA 时代仍发挥关键作用,特别适用于 macOS/Linux 环境下的 ABAP 开发和系统运维。其主要优势包括:平台无关性(支持 Windows/macOS/Linux/UNIX)、与 Windows 版本一致的交互体验、对核心事务码(如 ST22/SM21)的完整支持。版本管理需注意 7.80 已停止支持,建议升级至 8.10。安装支持原生包和通用 JAR 两种方式,推荐团队标准化版本和连接配置(通过 SAP UI Land

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 678

QML入门教程:三、QML基本元素

QML 基本元素可以分为可视元素和不可视元素两类。可视元素(例如前面提到过的Rectangle)具有几何坐标,会在屏幕上占据一块显示区域。不可视元素(例如 Timer)通常提供一种功能,这些功能可以作用于可视元素。 这里我们将会集中介绍最基本的可视元素:Item、Rectangle、Text、Image 和MouseArea。 1、Item Item是所有可视元素中最基本的一个。它是所有...

左霖风的博客 7083

《QGIS空间数据处理与高级制图》【目录】

《QGIS空间数据处理与高级制图》是一本面向GIS技术人员和学生的进阶手册,重点提升数据处理效率和专业制图标准化水平。全书涵盖空间数据预处理、矢量编辑、栅格处理、坐标系统应用和符号化设计等核心内容。书中详细介绍了批量数据转换、拓扑检查、遥感影像处理、自定义坐标系创建等实用技能,并提供了模型构建器和PyQGIS脚本实现自动化操作。通过大量实战案例和问题排查指南,帮助读者从基础使用进阶到专业应用,适合测绘、规划、环保等行业的GIS从业者参考使用。

LuckyHanMo的博客 374

QML开发:QML中的基本元素

在 QML 中,基本元素(Basic Elements) 是构建 UI 界面的核心组件。QML 采用声明式语法,通过这些元素定义界面结构、行为和交互。

TechNomad的博客 890

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)

这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。

2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

QML之定位器(Column,Row,Flow,Grid)

qml 定位器的介绍使用

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

QML之Column垂直定位器

Column是qml中的一个定位器,自动垂直排列子项,所需要设置的属性相对比较少。 Rectangle{ anchors.fill: parent color: "black" Column{ //垂直布局子对象 y:10 spacing: 20 //相邻项的间隔

Luck-Dream的博客 4675

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Qt 学习之路 2(80):定位器

QML 提供了很多用于定位的元素。这些元素叫做定位器,都包含在 QtQuick 模块。这些定位器主要有Row、Column、Grid和Flow等。 为了介绍定位器,我们先添加三个简单的组件用于演示: 首先是RedRectangle, RedRectangle 1 2 3 4 5 6 7 8 import...

weixin_30270561的博客 288

Qt6 QML Book/模型视图/基本模型

Basic Models 基本模型 The most basic way to visualize data from a model is to use theRepeaterelement. It is used to instantiate an array of items and is easy to combine with a positioner to populate a part of the user interface. A repeater uses a model, wh..

aggs1990的专栏 749

QML之三:基本元素

属性 // Text.qml import QtQuick 2.0 Text { // (1) identifier id: thisLabel // (2) set x- and y-position x: 24; y: 16 // (3) bind height to 2 * width height: 2 * width // (4) custom property property int times: 24 // (5) property alias prope

显闻 428

【QT教程】QT6 QML界面布局艺术

QT6 QML界面布局艺术 使用AI技术辅助生成QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C++扩展开发视频课程免费QT视频课程 您可以看免费1000+个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费QT视频课程 QT界面美化视频免费看QT6_QML布局容器概述 QT6 QML布局容器概述 QT6 QML是Qt框架的最新版本,它提供了一套丰富的布局容器,用于在用户界面中排列和定位元素。这些布局容

QT性能优化QT原理源码QT界面美化 2950
上一篇: 【Qt6 QML Book基础】05:图形变换(附完整可运行代码)
下一篇: 【Qt6 QML Book 基础】07:布局项 —— 锚定布局与动态交互(附完整可运行代码)
binary0010
博客等级 码龄3年 327粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

binary0010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值