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