Тип QML var
Тип var — это универсальный тип свойства, который может ссылаться на любой тип данных.
Он эквивалентен обычной переменной JavaScript. Например, переменные var могут хранить числа, строки, объекты, массивы и функции:
Item {
property var aNumber: 100
property var aBool: false
property var aString: "Hello world!"
property var anotherString: String("#FF008800")
property var aColor: Qt.rgba(0.2, 0.3, 0.4, 0.5)
property var aRect: Qt.rect(10, 10, 10, 10)
property var aPoint: Qt.point(10, 10)
property var aSize: Qt.size(10, 10)
property var aVector3d: Qt.vector3d(100, 100, 100)
property var anArray: [1, 2, 3, "four", "five", (function() { return "six"; })]
property var anObject: { "foo": 10, "bar": 20 }
property var aFunction: (function() { return "one"; })
} Семантика уведомлений о изменениях
Важно отметить, что изменения в обычных свойствах объектов JavaScript, назначенных свойству var, не будут вызывать обновлений привязок, которые обращаются к ним. Пример ниже отобразит "У автомобиля 4 колеса", так как изменение свойства wheels не вызовет повторной оценки привязки, назначенной свойству "text":
Item {
property var car: new Object({wheels: 4})
Text {
text: "The car has " + car.wheels + " wheels";
}
Component.onCompleted: {
car.wheels = 6;
}
} Если обработчик onCompleted вместо этого содержал "car = new Object({wheels: 6})", то текст будет обновлен на "У автомобиля 6 колес", так как само свойство car будет изменено, что вызовет событие уведомления о изменении.
Семантика инициализации значений свойств
Синтаксис QML определяет, что фигурные скобки в правой части присваивания значения свойства обозначают привязку. Это может быть запутанно при инициализации свойства var, так как пустые фигурные скобки в JavaScript могут обозначать либо блок выражения, либо объявление пустого объекта. Если вы хотите инициализировать свойство var пустым значением объекта, необходимо заключить фигурные скобки в скобки.
Например:
Item {
property var first: {} // nothing = undefined
property var second: {{}} // empty expression block = undefined
property var third: ({}) // empty object
} В предыдущем примере свойство first привязано к пустому выражению, результат которого — неопределённый. Свойство second привязано к выражению, содержащему один пустой блок выражения ("{}"), который также имеет неопределённый результат. Свойство third привязано к выражению, которое оценивается как объявление пустого объекта, и, следовательно, свойство будет инициализировано этим значением пустого объекта.
Аналогично, двоеточие в JavaScript может быть либо присваиванием значения свойства объекта, либо меткой кода. Таким образом, инициализация свойства var значением объекта также может потребовать скобок:
Item {
property var first: { example: 'true' } // example is interpreted as a label
property var second: ({ example: 'true' }) // example is interpreted as a property
property var third: { 'example': 'true' } // example is interpreted as a property
Component.onCompleted: {
console.log(first.example) // prints 'undefined', as "first" was assigned a string
console.log(second.example) // prints 'true'
console.log(third.example) // prints 'true'
}
} См. также Основные типы QML.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qml-var.html