一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4690|回复: 1

QML基础——UI布局管理

[复制链接]
发表于 2017-6-9 11:09 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2017-6-9 11:13 编辑
+ l$ p9 ]/ }5 p- N: ]4 b% `  C" D4 E- q7 P+ q
概述
使用Qt做过UI的一定对QHBoxLayout, QVBoxLayout, 和QGridLayout这三个最重要也最常使用的layout managers非常熟悉。那么在QML中又是如何控制和管理UI布局的呢?那么我们这篇文章就为大家介绍这些基础知识。
首先,QML同样允许大家使用硬编码的方式将位置数值直接写到代码中,但是这样做首先难以适应UI的调整,其次代码维护起来也很困难。因此我们不推荐这样做。推荐大家使用的是以下三种布局管理器:Row,、Column、Grid,以及使用Anchor进行布局。
Row
QML 中的 Row 元素会将其子控件都排列在同一行,相互不重叠。我们还可以使用它的spacing 属性来定义子控件之间的距离。比如下列代码就会产生如图所示的效果:
Row {' `. L0 I0 X0 _% R3 [" R* k% ~$ h
    spacing: 2
( P. b. w& B- Z2 o. n# v/ Y    Rectangle { color: "red"; width: 50; height: 50 }  T' I6 `+ A+ k  V1 b
    Rectangle { color: "green"; width: 20; height: 50 }
0 h, N; [! X3 S$ Y" W# f) z    Rectangle { color: "blue"; width: 50; height: 20 }8 h# l/ ]. ]# Q( a+ a$ Z
}
2012013016181621.png
Column
QML 中的 Column元素会将其子控件都排列在同一列,相互不重叠。我们还可以使用它的spacing 属性来定义子控件之间的距离。比如下列代码就会产生如图所示的效果:
Column {- h/ x) G+ V6 \. w, G3 G
    spacing: 2/ |* Z2 \# O* D% Q" b' j
    Rectangle { color: "red"; width: 50; height: 50 }% ^* d& W$ c* b( d# s& ~  X
    Rectangle { color: "green"; width: 20; height: 50 }
' Z  }, Q; X" W* s/ {    Rectangle { color: "blue"; width: 50; height: 20 }
: }: y* `8 y1 G8 \' B, Z1 t( _}
2012013016193293.png
Grid
QML 中的 Grid元素会将其子控件都均匀地排列在一个网格内,相互不重叠,每一个子控件都被放置在一个网格单元的(0,0)位置,也就是左上角。Grid的rows 和columns属性定义网格的行数和列数,列数默认是4。我们还可以使用Grid的spacing 属性来定义网格单元之间的距离,这里注意水平和垂直方向的spacing都是一样的。比如下列代码就会产生如图所示的效果:
Grid {
! N: X4 j8 v% q8 q1 W0 h    columns: 3
) ]# h, G! C7 X( ]/ e  b    spacing: 2
  a. t8 R$ Q5 q    Rectangle { color: "red"; width: 50; height: 50 }! c4 j- p  [% m' Q2 P: V+ I
    Rectangle { color: "green"; width: 20; height: 50 }0 E/ Z% X5 p' c& x
    Rectangle { color: "blue"; width: 50; height: 20 }
; F; C* k; a$ N2 Z/ w8 t    Rectangle { color: "cyan"; width: 50; height: 50 }
/ t* q( r4 t1 F; ?, ~    Rectangle { color: "magenta"; width: 10; height: 10 }
& A' G* Z$ Q$ `; y/ m8 V5 ~}
  H+ J- I# r( l7 t# T# s, `
2012013016201496.png
混合应用
我们还可以将Grid、Row 和 Column 进行混合应用。比如下面的代码会产生如图所示的效果:
Column {; y7 D& W( m* H& X; ~$ C
    spacing: 2
; l& w  C9 _9 ~3 v* n    Rectangle { color: "red"; width: 50; height: 50 }
8 \$ J, p# L( |3 m  y' {( T) Z! ]% q& x( I    Row {
' K* Q) _2 |; H, Z        spacing: 2
; s0 v0 O; i5 h        Rectangle { color: "yellow"; width: 50; height: 50 }6 @, n, M' h" z2 U# `' `$ [
        Rectangle { color: "black"; width: 20; height: 50 }% O5 b! X% U* z( L' b
        Rectangle { color: "blue"; width:50; height: 20 }
/ {; ?9 {5 P; Z& F5 \* R    }
0 S, b" G  q! C. Y& c# V    Rectangle { color: "green"; width: 20; height: 50 }5 I8 A. z$ b: @! p, |1 `# i
}- S) @3 w! s3 K+ L' f4 o: Q
2012013016205935.png
Anchor
以上方法进行排列是不重叠的,而anchor通俗的说是当前图形相对于某一图形的位置(可重叠)
每一个item 都可以被认为具有 7 条隐藏的“anchor lines":left、 horizontalCenter、 right、 top、 verticalCenter、baseline、以及bottom,如下图所示:
····
其中baseline是指的文本所在的线,在上图中并未标出,如果item没有文字的话baselinw就和top的位置是相同的。
3 x2 g+ R: O; K9 V# @2 d- e除此之外,Anchor系统还提供了margins 和offsets。margins 是指一个item和外界之间所留有的空间,而offsets 则可以通过使用 center anchor lines来进行布局。如下图所示
·····
使用 QML anchoring系统,我们可以定义不同items之间的anchor lines之间的关系。例如:
Rectangle { id: rect1; ... }
5 P  S& W" b! e" Z+ j4 tRectangle { id: rect2; anchors.left: rect1.right; anchors.leftMargin: 5; ... }
·····
我们还可以使用多个anchors:
Rectangle { id: rect1; ... }
$ O4 {( f* a# Y' D* C6 QRectangle { id: rect2; anchors.left: rect1.right; anchors.top: rect1.bottom; ... }
·····
通过定义多个水平或垂直的anchors,我们还可以控制item的大小,例如:
Rectangle { id: rect1; x: 0; ... }! ~. G4 F* T, o# g+ T. s" w
Rectangle { id: rect2; anchors.left: rect1.right; anchors.right: rect3.left; ... }
% H, _( s8 a' v  bRectangle { id: rect3; x: 150; ... }
·····
注意:出于效率方面的考虑,我们只允许对一个item的邻居和之接父亲使用anchor定义。比如下面的定义是不合法的:
/ X% K$ S$ I5 g% O
Item {/ E3 C' Q" k# |
    id: group1
+ _& @1 {6 T! g5 G" c2 {    Rectangle { id: rect1; ... }
# r3 h+ C( c0 Q* F5 G8 ]}. X/ ]& D" Y: R/ S+ q& j
Item {, g; K" _8 S# i, F: S
    id: group2: I7 R1 j- I; }" E
    Rectangle { id: rect2; anchors.left: rect1.right; ... } // invalid anchor!8 _4 y0 t0 O5 B; E: |! a
}

: j4 Y3 q9 V; M' `
copycode.gif
发表于 2017-6-10 09:06 | 显示全部楼层
这个看的一头雾水啊
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-1-11 17:23 , Processed in 0.036016 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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