MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
QML-объект и его атрибуты
29.08.2018
17:46
Автор: xintrea
Текстовые метки: qt, qml, объект, определение, описание, атрибуты, класс, тип, метод
Раздел: Компьютер - Программирование - Язык C++ - Библиотека Qt - QML - Краткая памятка по QML

Это вольный перевод раздела QML Object Attributes из официальной англоязычной документации по Qt 5.11.



Каждый объект в QML имеет определенный набор атрибутов. Другими словами, каждый экземпляр объекта создается с набором атрибутов, которые были определены для этого типа объекта. Существует несколько различных видов атрибутов, которые могут быть заданы объекту QML.



Атрибуты в объявлении объекта

Объявление объекта в отдельном документе QML определяет новый тип. В этом объявлении также задается иерархия объектов, которая будет создана при создании экземпляра этого нового типа.

Набор атрибутов объекта QML выглядит следующим образом:

  • атрибут id
  • атрибуты свойств
  • атрибуты сигналов
  • атрибуты обработчиков сигналов
  • атрибуты методов
  • прикрепленные свойства и прикрепленные атрибуты обработчиков сигналов
  • атрибуты перечислений

Эти атрибуты подробно обсуждаются ниже.


Атрибут id

Каждый объект QML имеет ровно один атрибут id. Этот атрибут предоставляется самим языком (и его наличие не может быть переопределено или изменено).


Для атрибута id в экземпляре объекта может быть присвоено значение (имя), позволяющее идентифицировать этот объект. Через трибут id один объект может ссылаться на другие объекты. Атрибут id должен начинаться с буквы нижнего регистра или символа подчеркивания и не может содержать символы, отличные от букв, цифр и символов подчеркивания.


Ниже представлен объект TextInput и объект Text . Значение id объекта TextInput устанавливается в значение "myTextInput". Объект Text устанавливает его свойство text таким же значением, что и свойство text объекта TextInput, ссылаясь на myTextInput.text . Таким образом, оба элемента будут отображать один и тот же текст:



import QtQuick 2.0


Column {

width: 200; height: 200


TextInput {

id: myTextInput

text: "Hello World"

}


Text {

text: myTextInput.text

}

}


Внутри объекта можно ссылаться на любой id из любого места в области компонента, в котором он объявлен. Следовательно, значение id всегда должно быть уникальным в пределах области видимости. Для получения дополнительной информации см. раздел «Область действия и разрешение имен».


После создания экземпляра объекта, значение атрибута id не может быть изменено. Хотя этот атрибут выглядит как обычное свойство, он не является обычным свойством, и к нему применяются специальная семантика. Например, невозможно получить доступ к значению myTextInput.id в приведенном выше примере.



Атрибуты свойств


Свойство является атрибутом объекта, которому может быть присвоено статическое значение или значение, привязанное к динамическому выражению. Значение свойства может быть прочитано другими объектами. Как правило, свойство может быть изменено другим объектом, если это явно не запрещено для определенного свойства.



Определение атрибутов свойств


Свойство, видимое в QML, может быть определено для класса в C++ коде, путем объявления его через макрос Q_PROPERTY. Затем такой класс регистрируется в системе типов QML. Таким образом, QML-код может работать с классами, созданными в C++ коде.


Возможно определение свойств объект и непосредственно в QML-коде. Пользовательское свойство объекта может быть определено в объявлении объекта в QML-коде с помощью следующего синтаксиса:


[default] property <propertyType> <propertyName>


Таким образом, в объявлении объекта можно создавать свойства, значения которых которые могут быть заданы как внутренним кодом объекта, так и внешним кодом. Из-за этого очень легко управлять состоянием объекта.

Имена свойств должны начинаться с строчной буквы и содержать только буквы, цифры и символы подчеркивания. Зарезервированные слова JavaScript являются недопустимыми именами свойств. Ключевое слово по default является необязательным и изменяет семантику объявляемого свойства. Дополнительную информацию о модификаторе свойств по умолчанию см. в следующем разделе (свойства по-умолчанию).

Объявление пользовательского свойства неявно создает сигнал, автоматически вызываемый при изменении значения этого свойства, а также создает обработчик сигнала, имеющий имя


on<PropertyName>Changed


где <PropertyName> - это имя свойства, написанное с заглавной буквой.

В качестве примера можно рассмотреть следующее объявление объекта, которое определяет новый тип, происходящий из базового типа Rectangle. Он имеет два новых свойства, и обработчик сигнала, реализованный для одного из этих новых свойств:

Rectangle {

property color previousColor

property color nextColor

onNextColorChanged: console.log("The next color will be: " + nextColor.toString())

}



Валидные типы в определениях пользовательских свойств


Любой из основных типов QML, кроме типа перечисления, может использоваться в качестве типов пользовательских свойств. Например, это все допустимые объявления свойств:


Item {

property int someNumber

property string someString

property url someUrl

}


(Значения перечисления - это просто значения целого числа, и вместо них можно ссылаться на тип int)

Некоторые базовые типы предоставляются модулем QtQuick и поэтому не могут использоваться как типы свойств, если модуль не импортирован. Дополнительную информацию см. в документации по основным типам QML .

Обратите внимание, что имеется базовый тип var, который представляет из себя общий тип. Он может содержать любой тип значения, включая списки и объекты:


property var someNumber: 1.5

property var someString: "abc"

property var someBool: true

property var someList: [1, 2, "three", "four"]

property var someObject: Rectangle { width: 100; height: 100; color: "red" }


Кроме того, любой тип QML может использоваться как тип свойства. Например:


property Item someItem

property Rectangle someRectangle


Это относится и к пользовательским типам QML . Если тип QML был определен в файле с именем ColorfulButton.qml, тогда есть возможность иметь свойство с типом ColorfulButton.



Присвоение значений атрибутам свойств

Значение свойства в экземпляре объекта может быть задано двумя разными способами:

  • присвоение значения при инициализации
  • обязательное присвоение значения

В любом случае это значение может быть либо статическим значением, либо значением привязывающего выражения.



Присвоение значения при инициализации


Синтаксис присвоения значения свойства при инициализации следующий:


<propertyName>: <value>


При желании, присвоение значения при инициализации может быть объединено с определением свойства в объявлении объекта. В этом случае синтаксис определения свойства будет выглядеть следующим образом:


[default] property <propertyType> <propertyName> : <value>


Ниже приведен пример инициализации значения свойства:


import QtQuick 2.0


Rectangle {

color: "red"

property color nextColor: "blue" // Одновременное определение и инициализация свойсва

}



Задание значения свойства в императивнм стиле


Присваивание значения в императивном стиле - это когда значение свойства (либо статическое значение, либо выражение привязки) присваивается свойству из JavaScript-кода. Синтаксис задания значения через JavaScript показан ниже:


[<objectId>.]<propertyName> = value


Ниже приведен пример задания значения свойства объекта в имепартивном стиле:


import QtQuick 2.0


Rectangle {

id: rect

Component.onCompleted: {

rect.color = "red"

}

}




Статические значения и значения выражения привязки


Как отмечалось ранее, существует два типа значений, которые могут быть присвоены свойству: статические значения и значения привязки . Последние также известны как привязка свойств .




Вид значения

Семантика

Статическое значение

Простое значение, которое не зависит от других свойств.

Привязка

Выражение JavaScript, которое описывает связь свойства с другими свойствами. Переменные в этом выражении называются зависимостями свойства.

Механизм QML обеспечивает связь между свойством и его зависимостями. Когда какая-либо из зависимостей изменяет значение, механизм QML автоматически пересчитывает выражение привязки и присваивает новый результат свойству.


Ниже приведен пример, показывающий, что два свойства внутреннего прямоугольника зависят от свойств внешнего прямоугольника


import QtQuick 2.0


Rectangle {

// both of these are static value assignments on initialization

width: 400

height: 200


Rectangle {

// both of these are binding expression value assignments on initialization

width: parent.width / 2

height: parent.height

}

}


Примечание. Чтобы назначить выражение привязки императивно через JavaScript-код, выражение привязки должно содержаться в функции, которая передается в Qt.binding (), а затем значение, возвращаемое Qt.binding (), должно быть присвоено свойству. Следует учитывать, что Qt.binding () нельзя использовать при назначении выражения привязки при инициализации. Дополнительную информацию см. в разделе «Связывание свойств».


Дописать...



Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования