Компоненты Qt QML

Помимо компонентов AppStudio QML, доступных вам для разработки пользовательского интерфейса приложения, у вас есть доступ ко всем QML-компонентам The Qt Company. В данном разделе рассмотрены самые полезные компоненты. Для получения полного списка типов Qt QML обратитесь к документации по Qt.

Ниже приведены некоторые из наиболее часто используемых типов QML:

  • Позиционеры
  • Якоря
  • Компоновки
  • Повторители
  • Состояния
  • Подключения
Внимание:

Различия наблюдались в отображении элементов пользовательского интерфейса (UI) в приложениях AppStudio и образцах при переходе с Qt 5.13.1 на Qt 5.15.2. Некоторые различия включают положение, размер, компоновку, цвет, обрезку, обтекание и шрифт. Проверьте отображение всех элементов пользовательского интерфейса ваших приложений. В некоторых случаях вам может потребоваться изменить вложение ваших компонентов; в других случаях может потребоваться определение дополнительных или меньшего количества свойств. Поскольку существует большая гибкость в том, как определены элементы пользовательского интерфейса в QML, нет установленных правил.

В версии 5.15.2 типы свойств Qt, такие как bool, string и int являются строгими и больше не поддерживают нулевые или неопределенные значения. Если ваше приложение использует эти типы, вы должны подумать о том, как поддерживать нулевые или неопределенные значения. Вы также можете использовать тип свойства var, который допускает нулевые и неопределенные значения, а также все другие возможные значения.

Позиционеры

Позиционеры – это элементы-контейнеры, управляющие положением элементов пользовательского интерфейса. Типы позиционеров – строка, столбец, сетка и поток. Организация ваших элементов с использованием позиционеров позволит вам упорядочить их, создав компоновку, подходящую для пользовательских интерфейсов изменяемого размера. К примеру, организовав свои элементы в сетку, при просмотре приложения в портретной ориентировке вы увидите матрицу 2 на 5 элементов, но при переключении на альбомную компоновку сетка проведет новое упорядочение элементов сетки, чтобы они поместились на экране, в результате чего появится матрица размером 3 на 4 элемента.

Подробнее о позиционерах см. в документации Qt.

Якоря

У каждого элемента есть семь точек-якорей, относительно которых можно позиционировать другие элементы. Это точки: верх, низ, слева, справа, центр по горизонтали, центр по вертикали, и базовая линия (линия, на которой размещается текст в элементе). Для создания динамических интерфейсов отлично подходит такое позиционирование элементов. Якоря остаются даже при изменении измерений и местоположений элементов. Могут также задаваться поля якорей, определяющие, сколько пространства снаружи якоря элемента.

Подробнее о якорях см. в документации Qt.

Компоновки

Для использования компоновок Qt Quick Layouts вам понадобится файл дополнительного модуля QML, например:

import QtQuick.Layouts 1.15

Три компоновки – это RowLayout (строки), ColumnLayout (столбцы) и GridLayout (сетка). По сравнению со строками, столбцами и сеткой использование компоновок позволит вам более точно контролировать позиционирование элементов. Это включает в том числе возможность задания выравнивания для каждого элемента компоновки. В GridLayouts также позволяет задать промежутки между столбцами и строками, распределить элементы по вертикали и по горизонтали, а также задать для элемента индивидуальную ячейку. Компоновки могут использоваться для задания максимальных значений ширины и высоты, а также возможности их заполнения для каждого элемента. Это особенно важно при разработке интерфейса для динамических экранов и для нескольких экранов. Компоновки можно зеркально отображать, меняя порядок элементов "слева направо" на "справа налево".

Повторители

Повторитель создает элементы из шаблона, предназначенные для использования с позиционерами, с помощью данных модели. Сочетание повторителей и позиционеров – легкий способ настройки большого числа элементов. Типы модели указаны ниже.

  • Номер, означающий число представителей, созданных повторителем
  • Свободный список исходных данных – ListModel
  • Список строк
  • Список объектов

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

Подробнее о повторителях см. в документации Qt.

Состояния

Состояния можно использовать для показа различных видов или экранов в приложении. Можно использовать их, чтобы показать или скрыть элементы на основании значения свойства, для изменения якоря или изменения родительских объектов. В зависимости от состояния можно запускать, останавливать и ставить на паузу анимации или выполнение скриптов. У каждого основанного на элементе компонента есть свойство состояния и состояние по умолчанию. Состояние по умолчанию – то есть пустая строка ("") – содержит все начальные значения свойств. Задание для свойства состояния как пустой строки загрузит состояние по умолчанию.

Подробнее о состояниях см. в документации Qt.

Подключения

В Qt5.15 появился новый синтаксис для подключений. Предыдущий метод создания обработчика on <Signal> устарел, и теперь следует соблюдать синтаксис функции. Ниже приведено предупреждающее сообщение, которое вы получите при запуске приложения с использованием предыдущего синтаксиса подключения:

qrc:/qml/main.qml:277:5: QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo (<arguments>) { ... }

В следующем примере показано, как обычно определялось подключение в версии Qt 5.13 и более ранних:

Connections { 
     target: mouseArea 
     onPositionChanged: { 
         console.log( "onPositionChanged: ", mouse.x, mouse.y ); 
     } 
     onPressedChanged: { 
         console.log( "onPressedChanged: ", mouseArea.pressed ); 
     } 
}

В следующем примере показано, как должно быть определено подключение в версии Qt 5.15 и более новых:

Connections { 
     target: mouseArea 
     function onPositionChanged(mouse) { 
         console.log( "onPositionChanged: ", mouse.x, mouse.y ); 
     } 
     function onPressedChanged() { 
         console.log( "onPressedChanged: ", mouseArea.pressed ); 
     } 
}

Теперь, когда используется синтаксис функции, вы должны убедиться, что все параметры сигнала указаны явно. Если вы их пропустите, параметры сигнала не будут доступны по их имени, и это может привести к неопределенным ссылкам в вашем коде. Например, используйте function onPositionChanged(mouse) вместо onPositionChanged.

При перечислении параметров сигнала рекомендуется указывать все параметры в правильном порядке, используя формальные имена параметров сигнала в качестве имен параметров функции. Например, используйте function onPositionChanged(mouse), а не function onPositionChanged(m).

Если сигнал предназначен для изменения свойства, вы должны явно назвать объект для доступа к свойству. Например, используйте mouseArea.pressed вместо pressed.

Подробнее о подключениях см. в документации Qt.