Основные элементы QML
Элементы можно разделить на визуальные и невизуальные. Визуальный элемент (например, Rectangle
, прямоугольник) имеет геометрическую форму и обычно представляет собой область на экране. Невизуальный элемент (например, Timer
, таймер) обеспечивает общую функциональность, обычно используемую для управления визуальными элементами.
Сейчас мы сосредоточимся на основных визуальных элементах, таких как Item
, Rectangle
, Text
, Image
и MouseArea
. Однако с помощью модуля Qt Quick Controls 2 можно создавать пользовательские интерфейсы, построенные из стандартных компонентов платформы, таких как кнопки, метки и ползунки.
Элемент Item
Item
является базовым элементом для всех визуальных элементов, поскольку все остальные визуальные элементы наследуются от Item
. Он ничего не рисует сам по себе, но определяет все свойства, общие для всех визуальных элементов:
- Геометрия –
x
иy
для определения положения сверху cлева ,width
иheight
для размеров элемента иz
для порядка наложения, чтобы поднимать или опускать элементы от их естественного порядка. - Обработка макета – якоря
anchors
(слева, справа, сверху, снизу, по центру по вертикали и по горизонтали) для позиционирования элементов относительно других элементов с необязательными отступамиmargins
. - Обработка клавиатуры – прикрепленные свойства
Key
иKeyNavigation
для управления обработкой нажатий клавиш и свойствоfocus
, чтобы, в первую очередь, включить обработку клавиатуры. - Преобразование – преобразования масштабирования
scale
и поворотаrotate
и общее списочное свойствоtransform
для преобразования x, y, z, а также точкаtransformOrigin
. - Визуализация –
opacity
для управления прозрачностью,visible
для отображения/скрытия элементов,clip
для ограничения операций рисования по границе элемента иsmooth
для повышения качества рендеринга. - Определение состояния – списочное свойство
states
с поддерживаемым списком состояний, свойство текущего состоянияstate
и списочное свойство переходовtransitions
для анимации изменений состояния.
Чтобы лучше понять различные свойства, мы попытаемся представить их в этой главе в контексте представленных элементов. Пожалуйста, помните, что эти основные свойства доступны для каждого визуального элемента и работают одинаково для всех этих элементов.
Совет
Элемент Item
часто используется как контейнер для других элементов, подобно элементу div
в HTML.
Элемент Rectangle
Rectangle
расширяет Item
и добавляет к нему цвет заливки. Кроме того, он поддерживает границы, определяемые свойствами border.color
и border.width
. Для создания прямоугольников со скругленными углами вы можете использовать свойство radius
.
Rectangle {
id: rect1
x: 12; y: 12
width: 76; height: 96
color: "lightsteelblue"
}
Rectangle {
id: rect2
x: 112; y: 12
width: 76; height: 96
border.color: "lightsteelblue"
border.width: 4
radius: 8
}
Совет
Допустимыми значениями цвета являются цвета из названий цветов SVG (см. http://www.w3.org/TR/css3-color/#svg-color). Вы можете указывать цвета в QML по-разному, но наиболее распространенным способом является строка RGB (#FF4444
) или имя цвета (например, white
).
Случайный цвет можно создать с помощью JavaScript:
color: Qt.rgba( Math.random(), Math.random(), Math.random(), 1 )
Помимо цвета заливки и границы, прямоугольник также поддерживает пользовательские градиенты:
Rectangle {
id: rect1
x: 12; y: 12
width: 176; height: 96
gradient: Gradient {
GradientStop { position: 0.0; color: "lightsteelblue" }
GradientStop { position: 1.0; color: "slategray" }
}
border.color: "slategray"
}
Градиент определяется последовательностью остановок градиента. Каждая остановка имеет позицию и цвет. Позиция отмечает положение по оси Y (0 = вверху, 1 = внизу). Цвет GradientStop
отмечает цвет в этой позиции.
Совет
Прямоугольник без заданной ширины/высоты не будет виден. Это часто происходит, когда у вас есть несколько прямоугольников, ширина (высота) которых зависит друг от друга, и что-то пошло не так в вашей логике композиции. Поэтому будьте осторожны!
Совет
Невозможно создать угловой градиент. Для этого лучше использовать предустановленные изображения. Одной из возможностей было бы просто повернуть прямоугольник с градиентом, но имейте в виду, что геометрия повернутого прямоугольника не изменится и, таким образом, приведет к путанице, поскольку геометрия элемента не будет совпадать с видимой областью. С точки зрения автора, в этом случае действительно лучше использовать подготовленные градиентные изображения.
Элемент Text
Для отображения текста можно использовать элемент Text
. Наиболее заметным его свойством является свойство text
типа string
. Элемент вычисляет свою начальную ширину и высоту на основе заданного текста и используемого шрифта. На шрифт можно повлиять с помощью группы свойств шрифта (например, font.family
, font.pixelSize
, …). Чтобы изменить цвет текста, просто используйте свойство color
.
Text {
text: "The quick brown fox"
color: "#303030"
font.family: "Ubuntu"
font.pixelSize: 28
}
Текст можно выровнять по каждой стороне и по центру с помощью свойств horizontalAlignment
и verticalAlignment
. Для дальнейшего улучшения рендеринга текста вы можете использовать свойства style
и styleColor
, которые позволяют вам отображать текст в контурном, приподнятом и вдавленном режиме.
Для более длинного текста часто требуется определить позицию разрыва, например, A very … long text, этого можно добиться с помощью свойства elide
. Свойство elide
позволяет вам установить положение многоточия слева, справа или в середине вашего текста.
Если вы не хотите, чтобы «…» режима elide
появлялось, и всё же хотите видеть полный текст, вы также можете обернуть текст, используя свойство wrapMode
(работает только тогда, когда ширина задана явно):
Text {
width: 40; height: 120
text: 'A very long text'
// '...' должно появиться посередине
elide: Text.ElideMiddle
// стиль красного утопленного текста
style: Text.Sunken
styleColor: '#FF4444'
// выравниваем текст по верхнему краю
verticalAlignment: Text.AlignTop
// имеет смысл только тогда, когда нет режима elide
// wrapMode: Text.WordWrap
}
Элемент Text
отображает только заданный текст, а оставшееся пространство, которое он занимает, прозрачно. Это означает, что он не отображает никакого фонового оформления, и поэтому вы можете предоставить фон, если хотите.
Совет
Имейте в виду, что начальная ширина элемента Text
зависит от установленного шрифта и текстовой строки. Элемент Text
без установленной ширины и без текста не будет виден, так как начальная ширина будет равна 0.
Совет
Часто, когда вы хотите расположить элементы Text
, вам нужно различать выравнивание текста внутри ограничивающего блока элемента Text
и выравнивание самого ограничивающего блока элемента. В первом случае необходимо использовать свойства horizontalAlignment
и verticalAlignment
, а во втором случае необходимо манипулировать геометрией элемента или использовать привязки.
Элемент Image
Элемент Image
может отображать изображения в различных форматах (например, PNG, JPG, GIF, BMP, WEBP). Полный список поддерживаемых форматов изображений смотрите в документации Qt. Помимо свойства source
для предоставления URL-адреса изображения, он содержит свойство fillMode
, которое управляет поведением изменения размера.
Image {
x: 12; y: 12
// width: 72
// height: 72
source: "assets/triangle_red.png"
}
Image {
x: 12+64+12; y: 12
// width: 72
height: 72/2
source: "assets/triangle_red.png"
fillMode: Image.PreserveAspectCrop
clip: true
}
Совет
URL-адрес может быть локальным путем с косой чертой ("./images/home.png") или веб-ссылкой (например, "http://example.org/home.png").
Совет
Элементы Image
, использующие PreserveAspectCrop
, также должны включать обрезку (clip
), чтобы данные изображения не отображались за пределами границ Image
. По умолчанию обрезка отключена (clip: false
). Вам нужно включить обрезку (clip: true
), чтобы ограничить рисование прямоугольником, ограничивающим элемент. Это можно использовать для любого визуального элемента, но следует использовать с осторожностью.
Совет
Используя C++, вы можете создать свой собственный поставщик изображений с помощью QQuickImageProvider
. Это позволяет создавать изображения «на лету» и использовать поточную загрузку изображений.
Элемент MouseArea
Для взаимодействия с этими элементами вы часто будете использовать MouseArea
. Это прямоугольный невидимый элемент, в котором вы можете фиксировать события мыши. MouseArea
часто используется вместе с видимым элементом для выполнения команд, когда пользователь взаимодействует с визуальной частью.
Rectangle {
id: rect1
x: 12; y: 12
width: 76; height: 96
color: "lightsteelblue"
MouseArea {
id: area
width: parent.width
height: parent.height
onClicked: rect2.visible = !rect2.visible
}
}
Rectangle {
id: rect2
x: 112; y: 12
width: 76; height: 96
border.color: "lightsteelblue"
border.width: 4
radius: 8
}
Совет
Важный аспект Qt Quick: обработка ввода отделена от визуального представления. Это позволяет показать пользователю элемент интерфейса, где фактическая область взаимодействия может быть больше.
Совет
Для более сложного взаимодействия смотрите Обработчики ввода Qt Quick. Они предназначены для использования вместо таких элементов, как MouseArea
и Flickable
, и обеспечивают больший контроль и гибкость. Идея состоит в том, чтобы обрабатывать один аспект взаимодействия в отдельном экземпляре обработчика вместо того, чтобы централизовывать обработку всех событий из заданного источника в одном элементе, как это было раньше.