详解 QML UI布局管理
创始人
2024-08-01 16:50:16
0

本文介绍的是QML UI布局管理,先来对UI进行介绍一下,使用Qt做过UI的一定对QHBoxLayout, QVBoxLayout, 和QGridLayout这三个最重要也最常使用的layout managers非常熟悉。那么在QML中又是如何控制和管理UI布局的呢?那么我们这篇文章就为大家介绍这些基础知识。

首先,QML同样允许大家使用硬编码的方式将位置数值直接写到代码中,但是这样做首先难以适应UI的调整,其次代码维护起来也很困难。因此我们不推荐这样做。推荐大家使用的是以下三种布局管理器:Row,、Column、Grid,以及使用Anchor进行布局。

Row

QML 中的 Row 元素会将其子控件都排列在同一行,相互不重叠。我们还可以使用它的spacing属性来定义子控件之间的距离。比如下列代码就会产生如图所示的效果:

  1. Row { spacing: 2Rectangle {  
  2.  color: "red"; width: 50; height: 50 }   
  3. Rectangle { color: "green"; width: 20; height: 50 } Rectangle { color: "blue"; width: 50; height: 20 }   
  4. }  
  5.  
  6.  

详解 QML UI布局管理

Column

QML 中的 Column元素会将其子控件都排列在同一行,相互不重叠。我们还可以使用它的spacing 属性来定义子控件之间的距离。比如下列代码就会产生如图所示的效果:

  1. view sourceprint?1 Column {     
  2.          spacing: 2     
  3.          Rectangle { color: "red"; width: 50; height: 50 }     
  4.          Rectangle { color: "green"; width: 20; height: 50 }     
  5.          Rectangle { color: "blue"; width: 50; height: 20 }     
  6.  }  

详解 QML UI布局管理

Grid

QML 中的 Grid元素会将其子控件都均匀地排列在一个网格内,相互不重叠,每一个子控件都被放置在一个网格单元的(0,0)位置,也就是左上角。Grid的rows 和columns属性定义网格的行数和列数,列数默认是4。我们还可以使用Grid的spacing 属性来定义网格单元之间的距离,这里注意水平和垂直方向的spacing都是一样的。比如下列代码就会产生如图所示的效果:

  1. view sourceprint?1 Grid {     
  2.          columns: 3     
  3.          spacing: 2     
  4.         Rectangle { color: "red"; width: 50; height: 50 }     
  5.         Rectangle { color: "green"; width: 20; height: 50 }     
  6.          Rectangle { color: "blue"; width: 50; height: 20 }     
  7.          Rectangle { color: "cyan"; width: 50; height: 50 }     
  8.         Rectangle { color: "magenta"; width: 10; height: 10 }     
  9.  }  

详解 QML UI布局管理 

#p#

混合应用

我们还可以将Grid、Row 和 Column 进行混合应用。比如下面的代码会产生如图所示的效果:

  1. view sourceprint?01 Column {    
  2.          spacing: 2    
  3.             Rectangle { color: "red"; width: 50; height: 50 }    
  4.             Row {    
  5.                     spacing: 2    
  6.           Rectangle { color: "yellow"; width: 50; height: 50 }    
  7.           Rectangle { color: "black"; width: 20; height: 50 }    
  8.           Rectangle { color: "blue"; width:50; height: 20 }    
  9.     }    
  10.    Rectangle { color: "green"; width: 20; height: 50 }    
  11.  }  

详解 QML UI布局管理

Anchor

每一个item 都可以被认为具有 7 条隐藏的“anchor lines":left、 horizontalCenter、 right、 top、 verticalCenter、baseline、以及bottom,如下图所示:详解 QML UI布局管理

其中baseline是指的文本所在的线,在上图中并未标出,如果item没有文字的话baselinw就和top的位置是相同的。除此之外,Anchor系统还提供了margins 和offsets。margins 是指一个item和外界之间所留有的空间,而offsets 则可以通过使用 center anchor lines来进行布局。如下图所示:

详解 QML UI布局管理 

#p#

使用 QML anchoring系统,我们可以定义不同items之间的anchor lines之间的关系。例如:

  1. view sourceprint?1 Rectangle { id: rect1; ... }    
  2. Rectangle { id: rect2; anchors.left: rect1.right; anchors.leftMargin: 5; ... }  

详解 QML UI布局管理

我们还可以使用多个anchors:

  1. view sourceprint?1 Rectangle { id: rect1; ... }    
  2. Rectangle { id: rect2; anchors.left: rect1.right; anchors.top: rect1.bottom; ... }  

详解 QML UI布局管理

通过定义多个水平或垂直的anchors,我们还可以控制item的大小,例如:

  1. view sourceprint?1 Rectangle { id: rect1; x: 0; ... }    
  2. Rectangle { id: rect2; anchors.left: rect1.right; anchors.right: rect3.left; ... }    
  3. Rectangle { id: rect3; x: 150; ... }  

详解 QML UI布局管理

注意:出于效率方面的考虑,我们只允许对一个item的邻居和之接父亲使用anchor定义。比如下面的定义是不合法的:

  1. Item {    
  2.      id: group1    
  3.       Rectangle { id: rect1; ... }    
  4.  }    
  5.  Item {    
  6.      id: group2    
  7.       Rectangle { id: rect2; anchors.left: rect1.right; ... } 
     }  

小结:详解 QML UI布局管理的内容介绍完了,希望本文对你有所帮助!

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...