一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4965|回复: 1

QML基础——UI布局管理

[复制链接]
发表于 2017-6-9 11:09 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-6-9 11:13 编辑 5 d+ z# s/ y+ \  l7 `

( F, x" r3 i  `0 K! h. w
概述
使用Qt做过UI的一定对QHBoxLayout, QVBoxLayout, 和QGridLayout这三个最重要也最常使用的layout managers非常熟悉。那么在QML中又是如何控制和管理UI布局的呢?那么我们这篇文章就为大家介绍这些基础知识。
首先,QML同样允许大家使用硬编码的方式将位置数值直接写到代码中,但是这样做首先难以适应UI的调整,其次代码维护起来也很困难。因此我们不推荐这样做。推荐大家使用的是以下三种布局管理器:Row,、Column、Grid,以及使用Anchor进行布局。
Row
QML 中的 Row 元素会将其子控件都排列在同一行,相互不重叠。我们还可以使用它的spacing 属性来定义子控件之间的距离。比如下列代码就会产生如图所示的效果:
Row {
* H& X+ E" E; u+ \    spacing: 2% i" l+ D" q$ o, ?  b; R6 l' n
    Rectangle { color: "red"; width: 50; height: 50 }( z# Y6 t* Y3 q$ t) V! J! M
    Rectangle { color: "green"; width: 20; height: 50 }, H& s' ~: `3 n
    Rectangle { color: "blue"; width: 50; height: 20 }) e; y' j& J) D2 N
}
2012013016181621.png
Column
QML 中的 Column元素会将其子控件都排列在同一列,相互不重叠。我们还可以使用它的spacing 属性来定义子控件之间的距离。比如下列代码就会产生如图所示的效果:
Column {7 F* c( m" s9 f/ }
    spacing: 2, b/ u  K# }  {" n6 h- {0 ]
    Rectangle { color: "red"; width: 50; height: 50 }% c) N/ b# C1 f: ?* t* o: ?
    Rectangle { color: "green"; width: 20; height: 50 }( r  k( n, X: P4 C
    Rectangle { color: "blue"; width: 50; height: 20 }
- d& O+ m0 f; E  ^3 O}
2012013016193293.png
Grid
QML 中的 Grid元素会将其子控件都均匀地排列在一个网格内,相互不重叠,每一个子控件都被放置在一个网格单元的(0,0)位置,也就是左上角。Grid的rows 和columns属性定义网格的行数和列数,列数默认是4。我们还可以使用Grid的spacing 属性来定义网格单元之间的距离,这里注意水平和垂直方向的spacing都是一样的。比如下列代码就会产生如图所示的效果:
Grid {
: C+ X% `1 D9 K. A9 y- a    columns: 39 a/ e' o$ T7 l0 G$ f3 c. x
    spacing: 2
4 j$ I' i9 A) s# s    Rectangle { color: "red"; width: 50; height: 50 }
6 y! u& G) \1 ]4 p) R2 Z; Y4 U    Rectangle { color: "green"; width: 20; height: 50 }% A! `) R8 q  B% G0 l8 E
    Rectangle { color: "blue"; width: 50; height: 20 }  F2 k6 ~9 j8 y2 U2 c$ p6 S2 E
    Rectangle { color: "cyan"; width: 50; height: 50 }
/ G; X( P% K7 H% Q  n# m7 E    Rectangle { color: "magenta"; width: 10; height: 10 }
3 \: y. \+ m# \/ L+ s9 ]: Q}
2 I8 l+ J( A% `3 P! b4 o
2012013016201496.png
混合应用
我们还可以将Grid、Row 和 Column 进行混合应用。比如下面的代码会产生如图所示的效果:
Column {
3 k( X( k7 w3 Q- [* G  h! H( {( e    spacing: 2* r8 B; M6 r- L, z# t: |2 h0 m
    Rectangle { color: "red"; width: 50; height: 50 }
$ b+ K6 s4 d$ q- i( y    Row {
: {& t" u* E  Y# V; I+ [) t        spacing: 2
( `4 L- U5 @* h8 j' R+ Q  w        Rectangle { color: "yellow"; width: 50; height: 50 }6 w( o1 {0 }: Y9 a* x
        Rectangle { color: "black"; width: 20; height: 50 }
* f# m1 n( S2 b' D4 @        Rectangle { color: "blue"; width:50; height: 20 }
. M; Q1 B( b* R  d6 G    }
' f* f5 o$ Z9 V$ z/ z! r( ^    Rectangle { color: "green"; width: 20; height: 50 }
- Q4 R& m3 j( i7 q! u0 `}
9 h" a$ W/ Z' E  K9 r- C
2012013016205935.png
Anchor
以上方法进行排列是不重叠的,而anchor通俗的说是当前图形相对于某一图形的位置(可重叠)
每一个item 都可以被认为具有 7 条隐藏的“anchor lines":left、 horizontalCenter、 right、 top、 verticalCenter、baseline、以及bottom,如下图所示:
····
其中baseline是指的文本所在的线,在上图中并未标出,如果item没有文字的话baselinw就和top的位置是相同的。: n0 w" J$ m. @, l" Y' ^& R
除此之外,Anchor系统还提供了margins 和offsets。margins 是指一个item和外界之间所留有的空间,而offsets 则可以通过使用 center anchor lines来进行布局。如下图所示
·····
使用 QML anchoring系统,我们可以定义不同items之间的anchor lines之间的关系。例如:
Rectangle { id: rect1; ... }3 T: i4 z& x. o3 @' h
Rectangle { id: rect2; anchors.left: rect1.right; anchors.leftMargin: 5; ... }
·····
我们还可以使用多个anchors:
Rectangle { id: rect1; ... }$ }8 J  N) [7 M0 u
Rectangle { id: rect2; anchors.left: rect1.right; anchors.top: rect1.bottom; ... }
·····
通过定义多个水平或垂直的anchors,我们还可以控制item的大小,例如:
Rectangle { id: rect1; x: 0; ... }
2 z# d: f  m, i- s3 I: tRectangle { id: rect2; anchors.left: rect1.right; anchors.right: rect3.left; ... }
! m9 j; r9 m5 }! q0 f, @/ XRectangle { id: rect3; x: 150; ... }
·····
注意:出于效率方面的考虑,我们只允许对一个item的邻居和之接父亲使用anchor定义。比如下面的定义是不合法的:

- w1 }7 ]& p0 V" |9 v$ cItem {
, Z) A5 x/ D0 i$ S4 t    id: group10 p; c$ A+ }5 z& M8 U  Z
    Rectangle { id: rect1; ... }
6 V/ c) [) ]* ]6 M; i7 D. g}
0 ]6 D; i' x! n; PItem {5 O* ~( I) s& ]
    id: group2$ z) P+ J3 {2 Y9 _
    Rectangle { id: rect2; anchors.left: rect1.right; ... } // invalid anchor!
# Q* A) }. U1 H0 b* Z- U}

! N# Z( e& y# |) W* T4 [
copycode.gif
发表于 2017-6-10 09:06 | 显示全部楼层
这个看的一头雾水啊
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2026-4-17 16:26 , Processed in 0.035348 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表