百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

QML--元素布局

bigegpt 2024-09-16 12:12 5 浏览

QML编程中可以使用x、y属性手动布局元素,但这些属性是与元素父对象左上角位置紧密相关的,不容易确定各子元素间的相对位置。为此,QML提供了定位器和锚点来简化元素的布局。

一、Positioner(定位器)

1.1、行列、网格定位

(1)RedRectangle.qml、GreenRectangle.qml、YellowRectangle.qml

//RedRectangle.qml
import QtQuick 2.0
Rectangle {
width: 64; height: 32
color: "red"
border.color: Qt.lighter(color)
}
//GreenRectangle
import QtQuick 2.0
Rectangle {
width: 64; height: 32
color: "green"
border.color: Qt.lighter(color)
}
//YellowRectangle
import QtQuick 2.0
Rectangle {
width: 64; height: 32
color: "yellow"
border.color: Qt.lighter(color)
}

Qt学习基地:C/C++项目实战/Qt5/C语言/c++/数据库/OpenCV/MFC/QT项目-学习视频教程-腾讯课堂

(2)MainForm.qml

import QtQuick 2.7
Rectangle {
width: 360; height: 360
MouseArea {
id: mouseArea
anchors.fill: parent
}
Row { //(a)
x: 25; y: 25
spacing: 10
layoutDirection: Qt.RightToLeft
//以下添加被Row定位的元素成员
RedRectangle {}
GreenRectangle {}
YellowRectangle {}
}
Column { //(b)
x: 25; y: 120
spacing: 2
//以下添加被Column定位的元素成员
RedRectangle {}
GreenRectangle {}
YellowRectangle {}
}
Grid { //(c)
x: 140; y: 120
columns: 3
spacing: 5
//以下是被Grid定位的元素成员
YellowRectangle {}
YellowRectangle {}
YellowRectangle {}
YellowRectangle {}
YellowRectangle {}
}
}

?(a)Row {...}???:Row将其定位的元素成员都放置在一行的位置,所有元素之间的间距相等(由spacing属性设置),顶端保持对齐。layoutDirection属性设置元素的排列顺序,可取值为Qt.LeftToRight(默认,从左向右)、Qt.RightToLeft(从右向左)。

???(b)Column {...}???:Column将元素成员按照加入的顺序从上到下在同一列排列出来,同样由spacing属性指定元素间距,所有元素靠左对齐。

???(c)Grid {...}??:Grid将其元素成员排列成一个网格,默认从左向右排列,每行4个元素。可通过设置rows和columns属性来自定义行和列的数值,如果 二者有一个不显示设置,则另一个会根据元素成员的总数计算出来。例如,本例中的columns设置为3,一共放入5个蓝色矩形,行数就会自动计算为2.

(3)运行结果



1.2、流定位(Flow)

(1)MainForm.qml

import QtQuick 2.7
Rectangle {
width: 360; height: 360
MouseArea {
id: mouseArea
anchors.fill: parent
}
Flow { //(a)
anchors.fill: parent
anchors.margins: 15
spacing: 5
RedRectangle {}
GreenRectangle {}
YellowRectangle {}
}
}

??(a)Flow {...}??:顾名思义,Flow会将其元素成员以流的形式显示出来,它既可以从左向右横向布局,也可以从上向下纵向布局,或反之。但与Row、Column等定位器不同的是,添加到Flow里的元素,会根据显示区(窗体)尺寸变化动态地调整其布局。以本程序为例,初始时元素是横向排列显示,当窗体被拉窄时,元素是纵向排列显示。

(2)、运行效果

1.3、重复器(Repeater)

重复器用户创建大量相似的元素成员,常与其他定位器结合起来使用。

示例:Repeater结合Grid来排列一组矩形元素:

(1)MainForm.qml

import QtQuick 2.7
Rectangle {
width: 200; height: 200
MouseArea {
id: mouseArea
anchors.fill: parent
}
Grid {
x: 25; y: 25
spacing: 4
Repeater { //(a)
model: 16
Rectangle {
width: 48; height: 48
color: "aqua"
Text {
anchors.centerIn: parent
color: "black"
font.pointSize: 20
text: index //(b)
}
}
}
}
}

??(a)Repeater {...}???:重复器,作为Grid的数据提供者,它可以创建任何QML基本的可是原始。因Repeater会按照其model属性定义的个数循环生成子元素,故上面代码重复生成16个Rectangle。

???(b)text: index??:Repeater会为每个子元素注入一个index属性,作为当前的循环索引(本例中是0~15)。因可以在子元素中直接使用这个属性,故可以用它给Text的text属性赋值。

(2)运行效果

四、Anchor(锚)

除前面介绍的Row、Column和Grid等外,QML还提供了Anchor(锚)来进行元素布局的方法。每个元素都可以被认为有一组无线的“锚线”:left、horizontalCenter、right、top、verticalCenter和bottom,如下图示:

这些锚线分别对应元素中的anchors.left、anchors.horizontalCenter等属性,所有的可视元素都可以使用锚来布局。锚系统还允许为一个元素的锚指定边距(margin)和偏移(offset)。边距指定了元素锚到外边界的空间量,而偏移允许使用中心锚线来定位。一个元素可以通过leftMargin、rightMargin、topMargin和bottomMargin来独立地指定锚边界,如下图示。也可以使用anchors.margins来为所有的4个锚指定相同的边距。

锚偏移使用horizontalCenterOffset、verticalCenterOffset和baselineOffset来指定。编程中经常使用anchors.fill将一个元素充满另一个元素,这等价于使用4个直接的锚。但要注意,智能在父子或兄弟元素之间使用锚,而且基于锚的布局不能与绝对的位置定义(如直接设置x和y属性值)混合使用,否则会出现不确定的结果。

(1)MainForm.qml

import QtQuick 2.7
Rectangle {
width: 360; height: 360
property alias mouseArea: mouseArea
MouseArea {
id: mouseArea
anchors.fill: parent
}
YellowRectangle {
id: yellowRect
anchors.left: parent.left
anchors.top: parent.top
anchors.leftMargin: 25
anchors.topMargin: 25
}
GreenRectangle {
id: greenRect
anchors.left: yellowRect.right
anchors.top: yellowRect.top
anchors.leftMargin: 40
}
RedRectangle {
id: redRect
anchors.left: greenRect.right
anchors.top: greenRect.top
anchors.leftMargin: 40
}
}

(2)运行效果


【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」

相关推荐

最全的MySQL总结,助你向阿里“开炮”(面试题+笔记+思维图)

前言作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上...

Redis数据库从入门到精通(redis数据库设计)

目录一、常见的非关系型数据库NOSQL分类二、了解Redis三、Redis的单节点安装教程四、Redis的常用命令1、Help帮助命令2、SET命令3、过期命令4、查找键命令5、操作键命令6、GET命...

netcore 急速接入第三方登录,不看后悔

新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢。如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下:https://oauthlogin.net/前言此次带来得这个小项目是...

精选 30 个 C++ 面试题(含解析)(c++面试题和答案汇总)

大家好,我是柠檬哥,专注编程知识分享。欢迎关注@程序员柠檬橙,编程路上不迷路,私信发送以下关键字获取编程资源:发送1024打包下载10个G编程资源学习资料发送001获取阿里大神LeetCode...

Oracle 12c系列(一)|多租户容器数据库

作者杨禹航出品沃趣技术Oracle12.1发布至今已有多年,但国内Oracle12C的用户并不多,随着12.2在去年的发布,选择安装Oracle12c的客户量明显增加,在接下来的几年中,Or...

flutter系列之:UI layout简介(flutter-ui-nice)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。在flutter中,基本上所有的对象都是wi...

Flutter 分页功能表格控件(flutter 列表)

老孟导读:前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件详细解析来来。PaginatedDataTablePaginatedDataTable是一个带分页功能的DataTable,...

Flutter | 使用BottomNavigationBar快速构建底部导航

平时我们在使用app时经常会看到底部导航栏,而在flutter中它的实现也较为简单.需要用到的组件:BottomNavigationBar导航栏的主体BottomNavigationBarI...

Android中的数据库和本地存储在Flutter中是怎样实现的

如何使用SharedPreferences?在Android中,你可以使用SharedPreferencesAPI来存储少量的键值对。在Flutter中,使用Shared_Pref...

Flet,一个Flutter应用的实用Python库!

▼Flet:用Python轻松构建跨平台应用!在纷繁复杂的Python框架中,Flet宛如一缕清风,为开发者带来极致的跨平台应用开发体验。它用最简单的Python代码,帮你实现移动端、桌面端...

flutter系列之:做一个图像滤镜(flutter photo)

简介很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过css滤镜来实现这个功能。那么如果在flutter中,如果要实现这样的滤镜功能应该怎么处理呢?一起...

flutter软件开发笔记20-flutter web开发

flutterweb开发优势比较多,采用统一的语言,就能开发不同类型的软件,在web开发中,特别是后台式软件中,相比传统的html5开发,更高效,有点像c++编程的方式,把web设计出来了。一...

Flutter实战-请求封装(五)之设置抓包Proxy

用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来...

为什么不在 Flutter 中使用全局变量来管理状态

我相信没有人用全局变量来管理Flutter应用程序的状态。毫无疑问,我们的Flutter应用程序需要状态管理包或Flutter的基本小部件(例如InheritedWidget或St...

Flutter 攻略(Dart基本数据类型,变量 整理 2)

代码运行从main方法开始voidmain(){print("hellodart");}变量与常量var声明变量未初始化变量为nullvarc;//未初始化print(c)...