Spec-Zone.ru › Qt 5.13

Тип QML variant Базовый тип

Тип variant — это универсальный тип свойства. Он устарел и существует только для поддержки старых приложений; новые приложения должны использовать свойства типа var вместо него.

Свойство типа variant может хранить любые значения базовых типов:

Item {
    property variant aNumber: 100
    property variant aString: "Hello world!"
    property variant aBool: false
}

При интеграции с C++, обратите внимание, что любое значение QVariant переданное в QML из C++ автоматически преобразуется в значение variant, и наоборот.

Использование ограниченных ресурсов с типом variant

Свойство типа variant также может содержать изображение или пиксельную карту. Свойство variant, содержащее QPixmap или QImage, известно как "ограниченный ресурс", и движок декларативного кода попытается автоматически освободить такие ресурсы после завершения вычисления любого выражения JavaScript, требующего их копирования.

Клиенты могут явно освободить такой ограниченный ресурс, вызвав метод "destroy" на свойстве variant из JavaScript. Они также могут явно сохранить ограниченный ресурс, вызвав метод "preserve" на свойстве variant из JavaScript.

Хранение массивов и объектов

Тип variant также может содержать:

  • Массив значений базовых типов
  • Словарь пар ключ-значение с значениями базовых типов

Например, ниже представлен items массив и attributes словарь. Их содержимое можно изучить с помощью JavaScript for циклов. Отдельные значения массива доступны по индексу, а отдельные значения словаря — по ключу:

Item {
    property variant items: [1, 2, 3, "four", "five"]
    property variant attributes: { 'color': 'red', 'width': 100 }

    Component.onCompleted: {
        for (var i = 0; i < items.length; i++)
            console.log(items[i])

        for (var prop in attributes)
            console.log(prop, "=", attributes[prop])
    }
}

Хотя это удобный способ хранения значений типа массив и словарь, вы должны помнить, что свойства items и attributes не являются объектами QML (и, безусловно, не являются и объектами JavaScript), а пары ключ-значение в attributes не являются свойствами QML. Скорее, свойство items хранит массив значений, а attributes хранит набор пар ключ-значение. Поскольку они хранятся как набор значений, а не как объект, их содержимое нельзя изменять индивидуально:

Item {
    property variant items: [1, 2, 3, "four", "five"]
    property variant attributes: { 'color': 'red', 'width': 100 }

    Component.onCompleted: {
        items[0] = 10
        console.log(items[0])     // This will still be '1'!
        attributes.color = 'blue'
        console.log(attributes.color)     // This will still be 'red'!
    }
}

Поскольку невозможно по отдельности добавлять или удалять элементы из списка или объекта, хранящегося в variant, единственный способ изменить его содержимое — переназначить новое значение. Однако это неэффективно, так как приводит к сериализации и десериализации значения.

Кроме того, так как items и attributes не являются объектами QML, изменение их отдельных значений не вызывает уведомлений об изменении свойств. Если в приведенном примере были onNumberChanged или onAnimalChanged обработчики сигналов, они не были бы вызваны. Однако, если свойства items или attributes были переназначены на другие значения, такие обработчики были бы вызваны.

Программисты JavaScript также должны помнить, что при копировании объекта JavaScript в свойство массива или словаря копируются данные объекта (то есть его пары свойств ключ-значение), а не сам объект. Свойство не хранит ссылку на исходный объект JavaScript, и дополнительная информация, такая как цепочка прототипов JavaScript объекта, также теряется в этом процессе.

Этот базовый тип предоставляется языком QML.

См. также Базовые типы QML.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qml-variant.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API