Основные модели в QML

Добавлено 3 апреля 2022 в 23:38

Самый простой способ визуализации данных из модели – использование элемента повторителя 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
        }
    }
}
использование числа в repeater

Использование массива

Какими бы красивыми ни были списки пронумерованных элементов, иногда интересно отобразить более сложный набор данных. Этого можно добиться, заменив целочисленное значение в 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 + ')'
        }
    }
}
использование массива в repeater

Использование 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
            }
        }
    }
}
использование модели в repeater

Использование delegate в качестве свойства по умолчанию

Свойство delegate элемента Repeater является его свойством по умолчанию. Это означает, что также возможно написать код первого примера следующим образом:

import QtQuick
import "../common"

Column {
    spacing: 2

    Repeater {
        model: 10

        BlueBox {
            required property int index
            width: 100
            height: 32
            text: index
        }
    }
}

Теги

GUI / Графический интерфейс пользователяJavaScriptQMLQtQtQuickQtQuick ControlsПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.