Небольшая заметка, родившаяся из вопроса одного из постоянных читателей сайта. При разработке интерфейса приложения под QML для позиционирования объектов в GridLayout необходимо использовать функционал вложенных свойств Layout. Таких как:
- Layout.row - указывает строку, в которой располагается объект;
- Layout.column - указывает колонку, в которой располагается объект;
- Layout.rowSpan - указывает, на сколько строк должен быть растянут объект;
- Layout.columnSpan - указывает, на сколько колонок должен быть растянут объект;
- Layout.minimumWidth - минимальная ширина объекта в слое;
- Layout.minimumHeight - минимальная высота объекта в слое;
- Layout.preferredWidth - предпочтительная ширина объекта в слое;
- Layout.preferredHeight - предпочтительная высота объекта в слое;
- Layout.maximumWidth - максимальная ширина объекта в слое;
- Layout.maximumHeight - максимальная высота объекта в слое;
- Layout.fillWidth - заполнение по ширине;
- Layout.fillHeight - заполнение по высоте;
- Layout.alignment - выравнивание в слое;
Свойства GridLayout
Также для полноты картины укажу свойства GridLayout и за что они отвечают:
- columnSpacing : real - пробелы между колонками (разрыв между объектами);
- columns : int - количество колонок;
- flow : enumeration - направление расположения объектов в GridLayout
- GridLayout.LeftToRight (default) - слева направо
- GridLayout.TopToBottom - сверху вниз
- layoutDirection : enumeration - направление перечисления объектов при заданном flow
- Qt.LeftToRight (default) - слева направо
- Qt.RightToLeft - справа налево
- rowSpacing : real - пробелы между строками (разрыв между объектами);
- rows : int - количество строк;
Если задаём:
- flow: GridLayout.TopToBottom
- layoutDirection: Qt.RightToLeft
То в результате получим, что первый элемент строки будет в самом вверху, а последний элемент строки будет в самом низу. В случае наличия двух строк, элементы первой строки будут располагаться справа.
Работа с GridLayout
Для демонстрации позиционирования элементов в слое предлагаю следующий программный код. В котором несколько прямоугольников будут растягиваться на несколько ячеек GridLayout.
- import QtQuick 2.5
- import QtQuick.Controls 1.4
- import QtQuick.Layouts 1.1
- ApplicationWindow {
- visible: true
- width: 480
- height: 480
- title: qsTr("Hello World")
- GridLayout {
- id: grid
- anchors.fill: parent
- rows: 3
- columns: 3
- Rectangle {
- color: "red"
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.columnSpan: 2
- Layout.rowSpan: 1
- Layout.row: 1
- Layout.column: 2
- }
- Rectangle {
- color: "blue"
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.columnSpan: 1
- Layout.rowSpan: 2
- Layout.row: 1
- Layout.column: 1
- }
- Rectangle {
- color: "green"
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.columnSpan: 1
- Layout.rowSpan: 2
- Layout.row: 2
- Layout.column: 3
- }
- Rectangle {
- color: "white"
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.columnSpan: 1
- Layout.rowSpan: 1
- Layout.row: 2
- Layout.column: 2
- }
- Rectangle {
- color: "yellow"
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.columnSpan: 2
- Layout.rowSpan: 1
- Layout.row: 3
- Layout.column: 1
- }
- }
- }
Итог
Результат работы данного программного кода показан на рисунке. Также выше перечисленная логика расположения объектов применима и к другим объектам Layout.