Тип 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.14/qml-variant.html