Spec-Zone.ru › Qt 5.11

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

Spec-Zone.ru

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