Позиционирование элементов в QML
Существует ряд элементов QML, используемых для позиционирования объектов. Они называются позиционерами, из которых модуль Qt Quick предоставляет следующее: Row, Column, Grid и Flow. Их можно увидеть с одинаковым содержимым на иллюстрациях ниже.
Совет
Прежде чем мы углубимся в детали, позвольте мне представить некоторые вспомогательные элементы: красный, синий, зеленый, светлый и темный квадраты. Каждый из этих компонентов содержит закрашенный прямоугольник размером 48x48 пикселей. В качестве справки, вот исходный код RedSquare:
// RedSquare.qml
import QtQuick
Rectangle {
width: 48
height: 48
color: "#ea7025"
border.color: Qt.lighter(color)
}
Обратите внимание на использование Qt.lighter(color) для получения более светлого цвета границы на основе цвета заливки. Мы будем использовать эти вспомогательные компоненты в следующих примерах, чтобы сделать исходный код более компактным и читабельным. Помните, что каждый прямоугольник изначально имеет размер 48x48 пикселей.
Элемент Column упорядочивает дочерние элементы в столбец, располагая их друг над другом. Свойство spacing можно использовать для изменения расстояния между дочерними элементами.
// column.qml
import QtQuick
DarkSquare {
id: root
width: 120
height: 240
Column {
id: row
anchors.centerIn: parent
spacing: 8
RedSquare { }
GreenSquare { width: 96 }
BlueSquare { }
}
}
Элемент Row размещает свои дочерние элементы рядом друг с другом либо слева направо, либо справа налево, в зависимости от свойства layoutDirection. Опять же, spacing используется для разделения дочерних элементов.
// row.qml
import QtQuick
BrightSquare {
id: root
width: 400; height: 120
Row {
id: row
anchors.centerIn: parent
spacing: 20
BlueSquare { }
GreenSquare { }
RedSquare { }
}
}
Элемент Grid упорядочивает своих дочерних элементов в сетке. Установив свойства rows и columns, можно ограничить количество строк и столбцов. Не устанавливая одно из них, оно будет рассчитываться на основе количества дочерних элементов. Например, установка количества строк на 3 и добавление 6 дочерних элементов приведет к 2 столбцам. Свойства flow и layoutDirection используются для управления порядком, в котором элементы добавляются в сетку, а spacing определяет расстояние, разделяющее дочерние элементы.
// grid.qml
import QtQuick
BrightSquare {
id: root
width: 160
height: 160
Grid {
id: grid
rows: 2
columns: 2
anchors.centerIn: parent
spacing: 8
RedSquare { }
RedSquare { }
RedSquare { }
RedSquare { }
}
}
Последний позиционер – Flow. Он добавляет свои дочерние элементы в «поток». Направление потока контролируется с помощью flow и layoutDirection. Он может идти вбок или сверху вниз. Он также может идти слева направо или в обратном направлении. Когда элементы добавляются в поток, они по мере необходимости оборачиваются для формирования новых строк или столбцов. Чтобы поток работал, он должен иметь ширину или высоту. Это можно установить либо напрямую, либо через якорные привязки.
// flow.qml
import QtQuick
BrightSquare {
id: root
width: 160
height: 160
Flow {
anchors.fill: parent
anchors.margins: 20
spacing: 20
RedSquare { }
BlueSquare { }
GreenSquare { }
}
}
Элементом, часто используемым с позиционерами, является Repeater (повторитель). Он работает как цикл for и перебирает модель. В простейшем случае модель – это просто значение, определяющее количество циклов.
// repeater.qml
import QtQuick
DarkSquare {
id: root
width: 252
height: 252
property variant colorArray: ["#00bde3", "#67c111", "#ea7025"]
Grid{
anchors.fill: parent
anchors.margins: 8
spacing: 4
Repeater {
model: 16
Rectangle {
width: 56; height: 56
property int colorIndex: Math.floor(Math.random()*3)
color: root.colorArray[colorIndex]
border.color: Qt.lighter(color)
Text {
anchors.centerIn: parent
color: "#f0f0f0"
text: "Cell " + index
}
}
}
}
}
В этом примере повторителя мы используем новую магию. Мы определяем собственное свойство colorArray, которое представляет собой массив цветов. Повторитель создает последовательность прямоугольников (16, как определено моделью). Для каждого цикла он создает прямоугольник, определенный как дочерний элемент повторителя. В прямоугольнике мы выбираем цвет с помощью математических функций JS: Math.floor(Math.random()*3). Это дает нам случайное число в диапазоне от 0 до 2, которое мы используем для выбора цвета из нашего массива цветов. Как отмечалось ранее, JavaScript является основной частью Qt Quick, поэтому нам доступны стандартные библиотеки.
Повторитель вводит свойство index. Он содержит текущий индекс цикла. (0,1,..15). Мы можем использовать это для принятия собственных решений на основе индекса или, в нашем случае, для визуализации текущего индекса с помощью элемента Text.
Совет
Более продвинутая обработка больших моделей и представлений с динамическими делегатами описана в отдельной главе о модели и представлении. Повторители лучше всего использовать, когда необходимо представить небольшой объем статических данных.
