Spec-Zone.ru › Qt 5.15

Тип 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 — набор пар ключ-значение.

Кроме того, поскольку items и attributes не являются объектами QML, изменение значений, которые они содержат, не вызывает уведомлений о изменении свойств. Если в приведенном выше примере были обработчики сигналов onItemsChanged или onAttributesChanged, они не вызывались бы при присвоении отдельных записей в любом из свойств. Однако, если свойства 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.15/qml-variant.html

Spec-Zone.ru

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