Основные модели в QML
Самый простой способ визуализации данных из модели – использование элемента повторителя Repeater. Он используется для создания массива элементов и легко комбинируется с позиционером для заполнения части пользовательского интерфейса. Repeater использует модель, которая может быть любой: от количества элементов для создания экземпляров до полноценной модели, собирающей данные из Интернета.
Использование числа
В своей простейшей форме Repeater можно использовать для создания определенного количества экземпляров элементов. Каждый элемент будет иметь доступ к присоединенному свойству, переменной index, которую можно использовать для различения элементов.
В приведенном ниже примере повторитель используется для создания 10 экземпляров элемента. Количество элементов управляется с помощью свойства model, а их визуальное представление управляется с помощью свойства delegate. Для каждого элемента в модели создается экземпляр делегата (здесь делегат – это BlueBox, который представляет собой пользовательский элемент прямоугольника Rectangle, содержащий элемент Text. Как вы можете заметить, для свойства text установлено значение index, поэтому элементы нумеруются от нуля до девяти.
import QtQuick
import "../common"
Column {
spacing: 2
Repeater {
model: 10
delegate: BlueBox {
required property int index
width: 100
height: 32
text: index
}
}
}
Использование массива
Какими бы красивыми ни были списки пронумерованных элементов, иногда интересно отобразить более сложный набор данных. Этого можно добиться, заменив целочисленное значение в model массивом JavaScript. Содержимое массива может быть любого типа, будь то строки, целые числа или объекты. В приведенном ниже примере используется список строк. Мы по-прежнему можем обращаться к переменной index и использовать ее, но у нас также есть доступ к modelData, содержащему данные для каждого элемента в массиве.
import QtQuick
import "../common"
Column {
spacing: 2
Repeater {
model: ["Enterprise", "Columbia", "Challenger", "Discovery", "Endeavour", "Atlantis"]
delegate: BlueBox {
required property var modelData
required property int index
width: 100
height: 32
radius: 3
text: modelData + ' (' + index + ')'
}
}
}
Использование ListModel
Имея возможность предоставлять данные массива, вы вскоре окажетесь в ситуации, когда вам потребуется несколько фрагментов данных для каждого элемента массива. Здесь на сцену выходят модели. Одной из самых простых и часто используемых моделей является модель списка, ListModel. Модель списка – это просто набор элементов ListElement. Внутри каждого элемента списка ряд свойств может быть привязан к значениям. Например, в приведенном ниже примере для каждого элемента указаны имя и цвет.
Свойства, связанные внутри каждого элемента, присоединяются к каждому элементу, созданному повторителем. Это означает, что переменные name и surfaceColor доступны из области видимости каждого элемента Rectangle и Text, созданных повторителем. Это не только упрощает доступ к данным, но и упрощает чтение исходного кода. SurfaceColor – это цвет кружка слева от имени, а не что-то непонятное, как данные из столбца i строки j.
import QtQuick
import "../common"
Column {
spacing: 2
Repeater {
model: ListModel {
ListElement { name: "Mercury"; surfaceColor: "gray" }
ListElement { name: "Venus"; surfaceColor: "yellow" }
ListElement { name: "Earth"; surfaceColor: "blue" }
ListElement { name: "Mars"; surfaceColor: "orange" }
ListElement { name: "Jupiter"; surfaceColor: "orange" }
ListElement { name: "Saturn"; surfaceColor: "yellow" }
ListElement { name: "Uranus"; surfaceColor: "lightBlue" }
ListElement { name: "Neptune"; surfaceColor: "lightBlue" }
}
delegate: BlueBox {
id: blueBox
required property string name
required property color surfaceColor
width: 120
height: 32
radius: 3
text: name
Box {
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: 4
width: 16
height: 16
radius: 8
color: blueBox.surfaceColor
}
}
}
}
Использование delegate в качестве свойства по умолчанию
Свойство delegate элемента Repeater является его свойством по умолчанию. Это означает, что также возможно написать код первого примера следующим образом:
import QtQuick
import "../common"
Column {
spacing: 2
Repeater {
model: 10
BlueBox {
required property int index
width: 100
height: 32
text: index
}
}
}
