有一些QML元素被用于放置元素对象,它们被称作定位器,QtQuick模块提供了Row,Column,Grid,Flow用来作为定位器。你可以在下面的插图中看到它们使用相同内容的显示效果。

  • Column(列)元素
    • 将它的子对象通过顶部对齐的列方式进行排列。
    • spacing属性用来设置每个元素之间的间隔大小。
  • Row(行)元素
    • 将它的子对象从左到右,或者从右到左依次排列,排列方式取决于layoutDirection属性。
    • spacing属性用来设置每个元素之间的间隔大小。
  • Grid(栅格)元素
    • 通过设置rows(行数)和columns(列数)将子对象排列在一个栅格中。可以只限制行数或者列数。如果没有设置它们中的任意一个,栅格元素会自动计算子项目总数来获得配置。例如,设置rows为3,添加了6个子项目到元素中,那么会自动计算columns为2。
    • 属性flow(流)与layoutDirection(布局方向)用来控制子元素的加入顺序。
    • spacing属性用来控制所有元素之间的间隔。
  • Flow(流)元素
    • 通过flow(流)属性和layoutDirection(布局方向)属性来控制流的方向。它能够从头到底的横向布局,也可以从左到右或者从右到左进行布局。作为加入流中的子对象,它们在需要时可以被包装成新的行或者列。
    • 为了让一个流可以工作,必须指定一个宽度或者高度,可以通过属性直接设定,或者通过anchor(锚定)布局设置。

组件

  1. // Color.qml
  2. import QtQuick 2.15
  3. Rectangle {
  4. width: 48
  5. height: 48
  6. border.color: Qt.lighter(color)
  7. }

请注意使用了Qt.lighter(color)来指定了基于填充色的边界高亮色。 颜色在使用该组件的地方设置 我们将会在后面的例子中使用到这些元素,希望后面的代码能够容易读懂。请记住每一个矩形框的初始化大小都是48乘48像素大小。

1.Column 列

34QB91__12}KGTUS92$EOBW.png

  1. import QtQuick 2.15
  2. import QtQuick.Window 2.15
  3. Rectangle {
  4. id: root
  5. width: 200
  6. height: 240
  7. Column {
  8. id: column
  9. anchors.centerIn: parent
  10. spacing: 0
  11. Color{
  12. color: "#ea7025"
  13. }
  14. Color {
  15. color: "#67c111"
  16. width: 96
  17. }
  18. Color {
  19. color: "#00bde3"
  20. }
  21. }
  22. }

2.Row 行

IC4B9%WG~LFP@Q9(V60}D}K.png

  1. import QtQuick 2.15
  2. import QtQuick.Window 2.15
  3. Rectangle {
  4. id: root
  5. width: 200
  6. height: 240
  7. Row {
  8. id: row
  9. anchors.centerIn: parent
  10. spacing: 5
  11. Color{
  12. color: "#ea7025"
  13. }
  14. Color {
  15. color: "#67c111"
  16. }
  17. Color {
  18. color: "#00bde3"
  19. }
  20. }
  21. }

3. Grid 栅格

9CC3$S7M9JLAPITNCOT@2RB.png![B{HN8BP~OMG}F@TU)BNNTT.png

  1. import QtQuick 2.15
  2. import QtQuick.Window 2.15
  3. Rectangle {
  4. id: root
  5. width: 200
  6. height: 240
  7. Grid {
  8. id: grid
  9. rows: 2
  10. columns: 2
  11. anchors.centerIn: parent
  12. spacing: 5
  13. // layoutDirection: "RightToLeft" // 从右向走
  14. Color{
  15. color: "#ea7025"
  16. }
  17. Color {
  18. color: "#67c111"
  19. }
  20. Color {
  21. color: "#00bde3"
  22. }
  23. // Color {
  24. // color: "#ffcc66"
  25. // }
  26. }
  27. }

4. flow 流

}_J8JG1J0H3T)5]@8GR6708.pngVR_1TJQY@C$7_{8A@(TNZBX.png

  1. import QtQuick 2.15
  2. import QtQuick.Window 2.15
  3. Rectangle {
  4. id: root
  5. width: 200
  6. height: 240
  7. Flow {
  8. id: flow
  9. anchors.centerIn: parent
  10. anchors.margins: 20
  11. spacing: 5
  12. // layoutDirection: "RightToLeft" // 效果是右图
  13. Color{
  14. color: "#ea7025"
  15. }
  16. Color {
  17. color: "#67c111"
  18. }
  19. Color {
  20. color: "#00bde3"
  21. }
  22. }
  23. }

5. Repeat(重复元素)与定位器

![WCRAWG7GUNH5}56VAGPX41.png

  1. import QtQuick 2.15
  2. import QtQuick.Window 2.15
  3. Rectangle {
  4. id: root
  5. width: 252
  6. height: 252
  7. property variant colorArray: ["#00bde3", "#67c111", "#ea7025"]
  8. Grid {
  9. id: flow
  10. anchors.centerIn: parent
  11. anchors.margins: 20
  12. spacing: 4
  13. Repeater {
  14. model: 16
  15. Rectangle {
  16. width: 56; height: 56
  17. property int colorIndex: Math.floor(Math.random()*3)
  18. color: root.colorArray[colorIndex]
  19. border.color: Qt.lighter(color)
  20. Text {
  21. anchors.centerIn: parent
  22. color: "#f0f0f0"
  23. text: "Cell " + index
  24. }
  25. }
  26. }
  27. }
  28. }

JavaScript是QtQuick中的一部分,所以这些典型的库函数我们都可以使用。即用JS数学函数Math.floor(Math.random()*3)来选择颜色 Repeater一次循环时会产生一个index(索引)属性值, 0 < index < model

注意 高级的大数据模型处理和使用动态代理的动态视图会在模型与视图(model-view)章节中讲解。当有一小部分的静态数据需要显示时,使用重复元素是最好的方式。