Рекомендации по разработке на QML и Qt Quick
Несмотря на все преимущества QML и Qt Quick, в определенных ситуациях они могут представлять сложность. В следующих разделах подробно рассмотрены некоторые лучшие практики, которые помогут вам получить лучшие результаты при разработке приложений.
Пользовательские элементы управления UI
Плавный и современный интерфейс пользователя (UI) имеет ключевое значение для успеха любого приложения в современном мире, и именно здесь QML оказывается очень полезным для дизайнеров и разработчиков. Qt предоставляет базовые элементы управления UI, необходимые для создания плавного и современного UI. Рекомендуется ознакомиться с этим списком элементов управления UI перед созданием собственных пользовательских элементов управления.
Помимо этих базовых элементов управления UI, предлагаемых самим Qt Quick, доступен богатый набор элементов управления Qt Quick Controls. Они удовлетворяют наиболее распространенным случаям использования без каких-либо изменений и предлагают гораздо больше возможностей с помощью опций настройки. В частности, Qt Quick Controls предоставляет параметры стилизации, соответствующие последним тенденциям дизайна UI. Если эти элементы управления UI не удовлетворяют потребности вашего приложения, только тогда рекомендуется создавать пользовательский элемент управления.
Дополнительная информация
Рекомендации по кодированию
См. Рекомендации по кодированию QML.
Объединение ресурсов приложения
Большинство приложений зависят от ресурсов, таких как изображения и значки, чтобы обеспечить богатый пользовательский опыт. Часто бывает сложно сделать эти ресурсы доступными для приложения независимо от целевой операционной системы. Большинство популярных ОС используют более строгие политики безопасности, которые ограничивают доступ к файловой системе, затрудняя загрузку этих ресурсов. В качестве альтернативы Qt предлагает собственную систему ресурсов, встроенную в исполняемый файл приложения, обеспечивая доступ к ресурсам приложения независимо от целевой ОС.
Например, рассмотрим следующую структуру каталогов проекта:
MyModule ├── images │ ├── image1.png │ └── image2.png ├── CMakeLists.txt └── main.qml
Вы можете представить эту структуру как модуль CMake QML следующим образом:
qt_add_qml_module(my_module
URI MyModule
VERSION 1.0
QML_FILES
main.qml
RESOURCES
images/image1.png
images/image2.png
# ...
) Все файлы QML, перечисленные в QML_FILES, будут автоматически компилироваться заблаговременно.
Дополнительная информация
Разделение интерфейса и логики
Одна из ключевых целей большинства разработчиков приложений — создание поддерживаемого приложения. Один из способов достижения этой цели — разделение пользовательского интерфейса (UI) и бизнес-логики. Ниже приведены несколько причин, по которым UI приложения следует писать на QML:
- Декларативные языки хорошо подходят для определения UI.
- Код QML проще писать, так как он менее многословный, чем C++, и не является строго типизированным. Это также делает его отличным языком для прототипирования, качество, которое имеет важное значение при сотрудничестве с дизайнерами, например.
- JavaScript легко используется в QML для реагирования на события.
Являясь строго типизированным языком, C++ лучше всего подходит для логики приложения. Обычно такой код выполняет задачи, такие как сложные вычисления или обработка данных, которые выполняются быстрее на C++ по сравнению с QML.
Qt предлагает различные подходы к интеграции кода QML и C++ в приложении. Типичный пример — отображение списка данных в пользовательском интерфейсе. Если набор данных статичный, простой и/или небольшой, модели, написанные на QML, могут быть достаточными.
Следующий фрагмент демонстрирует примеры моделей, написанных на QML:
model: [ "Item 1", "Item 2", "Item 3" ] model: 10
Используйте C++ для динамических наборов данных, которые являются большими или часто изменяются.
Экспонирование данных из C++ в QML
Переработка QML намного проще, чем переработка C++, поэтому для беспроблемного обслуживания мы должны стремиться к тому, чтобы типы C++ были максимально независимы от QML. Этого можно добиться, «передавая» ссылки на типы C++ в QML.
Это можно сделать, используя обязательные свойства и устанавливая их с помощью QQmlApplicationEngine::setInitialProperties. Также можно создать один или несколько синглтонов, которые будут возвращать все данные, которые сторона C++ хочет предоставить QML.
С этим подходом C++ остается неизменным в случае, если QML необходимо переработать в будущем.
Для быстрого руководства по выбору правильного подхода к экспонированию типов C++ в QML см. Выбор правильного метода интеграции между C++ и QML.
Дополнительная информация
Использование макетов Qt Quick
Qt предлагает макеты Qt Quick для визуального расположения элементов Qt Quick в макете. В отличие от альтернативных позиционеров элементов, макеты Qt Quick также могут изменять размер своих дочерних элементов при изменении размера окна. Хотя макеты Qt Quick часто являются предпочтительным выбором для большинства случаев использования, при их использовании необходимо учитывать следующие моменты:
Рекомендации
- Используйте anchors или свойства width и height для указания размера макета по отношению к родительскому элементу, не являющемуся макетом.
- Используйте свойство Layout для установки атрибутов размера и выравнивания непосредственных дочерних элементов макета.
Запрещается
- Не определяйте предпочтительные размеры для элементов, которые предоставляют implicitWidth и implicitHeight, если их неявные размеры не удовлетворяют.
- Не используйте anchors для элемента, являющегося непосредственным дочерним элементом макета. Вместо этого используйте
Layout.preferredWidthиLayout.preferredHeight:RowLayout { id: layout anchors.fill: parent spacing: 6 Rectangle { color: 'azure' Layout.fillWidth: true Layout.minimumWidth: 50 Layout.preferredWidth: 100 Layout.maximumWidth: 300 Layout.minimumHeight: 150 Text { anchors.centerIn: parent text: parent.width + 'x' + parent.height } } Rectangle { color: 'plum' Layout.fillWidth: true Layout.minimumWidth: 100 Layout.preferredWidth: 200 Layout.preferredHeight: 100 Text { anchors.centerIn: parent text: parent.width + 'x' + parent.height } } }
Примечание: Макеты и anchors — это типы объектов, которые занимают больше памяти и требуют больше времени для инициализации. Избегайте их использования (особенно в делегатах списков и таблиц, и стилях для элементов управления), когда достаточно простых связей со свойствами x, y, width и height.
Дополнительная информация
Безопасность типов
При объявлении свойств в QML легко и удобно использовать тип «var»:
property var name property var size property var optionsMenu
Однако этот подход имеет несколько недостатков:
- Если присвоено значение неверного типа, сообщение об ошибке укажет на место объявления свойства, а не на место, где свойству было присвоено значение. Это замедляет процесс разработки, затрудняя поиск ошибок.
- Статический анализ для обнаружения ошибок, упомянутых выше, невозможен.
- Фактический базовый тип свойства не всегда сразу понятен читателю.
Вместо этого всегда используйте фактический тип, когда это возможно:
property string name property int size property MyMenu optionsMenu
Производительность
Дополнительную информацию о производительности в QML и Qt Quick см. в разделе Учет производительности и рекомендации.
Предпочитайте декларативные связи императивным назначениям
В QML можно использовать императивный JavaScript-код для выполнения задач, таких как реагирование на события ввода, отправка данных по сети и т. д. Императивный код имеет важное значение в QML, но также важно знать, когда не следует его использовать.
Например, рассмотрите следующее императивное назначение:
Rectangle {
Component.onCompleted: color = "red"
} Это имеет следующие недостатки:
- Это медленно. Свойство color сначала будет вычислено со значением по умолчанию, а затем — со значением «red» позже.
- Это откладывает ошибки, которые можно было бы обнаружить на этапе компиляции, на время выполнения, замедляя процесс разработки.
- Это перезаписывает любую декларативную привязку, которая была установлена. В большинстве случаев это предполагается, но иногда это может быть непреднамеренным. Дополнительную информацию см. в разделе Отладка перезаписи привязок.
- Это мешает инструментам; например, Qt Quick Designer не поддерживает JavaScript.
Код можно переписать, чтобы он стал декларативной привязкой:
Rectangle {
color: "red"
} Инструменты и утилиты
Дополнительную информацию об полезных инструментах и утилитах, которые упрощают работу с QML и Qt Quick, см. в разделе Инструменты и утилиты Qt Quick.
Граф сцены
Дополнительную информацию о графике сцен Qt Quick см. в разделе Граф сцены Qt Quick.
Масштабируемые пользовательские интерфейсы
По мере улучшения разрешений дисплеев масштабируемый пользовательский интерфейс приложения становится все более важным. Один из подходов к достижению этого — сохранение нескольких копий UI для различных разрешений экрана и загрузка соответствующей в зависимости от доступного разрешения. Хотя это работает довольно хорошо, это увеличивает нагрузку на обслуживание.
Qt предлагает лучшее решение этой проблемы и рекомендует разработчикам приложений следовать этим советам:
- Используйте anchors или модуль Qt Quick Layouts для размещения визуальных элементов.
- Не указывайте явную ширину и высоту для визуального элемента.
- Предоставляйте ресурсы UI, такие как изображения и значки, для каждого разрешения дисплея, поддерживаемого вашим приложением. Пример галереи Qt Quick Controls хорошо демонстрирует это, предоставляя
qt-logo.pngдля разрешений@2x,@3x, и@4x, что позволяет приложению адаптироваться к дисплеям высокого разрешения. Qt автоматически выбирает соответствующее изображение, подходящее для данного дисплея, при условии, что функция масштабирования высокой DPI явно включена. - Используйте SVG-изображения для небольших значков. Хотя большие SVG-изображения могут быть медленными в рендеринге, маленькие работают хорошо. Векторные изображения исключают необходимость предоставления нескольких версий изображения, как это необходимо с растровыми изображениями.
- Используйте значки на основе шрифтов, такие как Font Awesome. Они масштабируются до любого разрешения дисплея и позволяют изменять цвет. Пример Qt Quick Controls Text Editor хорошо демонстрирует это.
При выполнении этих рекомендаций пользовательский интерфейс вашего приложения должен масштабироваться в зависимости от разрешения дисплея.
Дополнительная информация
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtquick-bestpractices.html