Основные элементы QML

Добавлено 1 марта 2022 в 17:27

Элементы можно разделить на визуальные и невизуальные. Визуальный элемент (например, 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
}
Rectangle

Совет

Допустимыми значениями цвета являются цвета из названий цветов 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, и обеспечивают больший контроль и гибкость. Идея состоит в том, чтобы обрабатывать один аспект взаимодействия в отдельном экземпляре обработчика вместо того, чтобы централизовывать обработку всех событий из заданного источника в одном элементе, как это было раньше.

Теги

GUI / Графический интерфейс пользователяQMLQtQtQuickОбучениеПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.