Изменения в Qt Quick Controls
Qt 6 — результат осознанных усилий по повышению эффективности и удобства использования фреймворка.
Мы стараемся поддерживать совместимость всех публичных API в каждом релизе. Некоторые изменения были неизбежны для того, чтобы сделать Qt лучшим фреймворком.
В этой статье мы подводим итоги этих изменений в Qt Quick Controls и даём рекомендации по их обработке.
Миграция с Qt Quick Controls 1
Qt Quick Controls 1 устарел в Qt 5.11 и удален в Qt 6.0. Используйте Qt Quick Controls (ранее известные как Qt Quick Controls 2) вместо них. Для получения дополнительной информации, обратитесь к теме Qt 5.15: Qt Quick Controls против Qt Quick Controls 1 в документации Qt 5.
Изменения в регистрации типов
Qt Quick Controls претерпели некоторые значительные, в основном внутренние изменения в Qt 6. Используя улучшенную регистрацию типов, представленную в Qt 5.15, мы прокладываем путь к компиляции QML-файлов модуля в C++ и повышаем эффективность инструментов. В частности, модель кода QML Qt Creator должна иметь более полное представление о типах, что повысит надёжность автодополнения и проверки ошибок кода Qt Quick Controls. Инструменты статического анализа, такие как qmllint и qmlformat, также выиграют от того, что станут осведомлены о типах, которые теперь объявлены во время компиляции в C++.
В результате этих изменений некоторые вещи выполняются немного по-другому.
Пользовательские стили теперь являются полноценными QML-модулями
Для обеспечения регистрации типов во время компиляции каждый стиль Qt Quick Controls теперь является полноценным QML-модулем. Раньше одного Button.qml было достаточно для создания собственного стиля. Несмотря на удобство, это требовало нестандартного API, что в свою очередь требовало адаптации инструментов, таких как Qt Designer.
Теперь все типы QML, реализуемые стилем, должны быть объявлены в файле qmldir этого стиля:
module MyStyle Button 1.0 Button.qml
Объединив это с остальной частью мира QML, стили становятся более понятными для разработчиков и, надеемся, проще для начинающих. Вследствие этого, следующий API был удален:
- QQuickStyle::addStylePath()
- QQuickStyle::availableStyles()
- QQuickStyle::path()
- QQuickStyle::stylePathList()
- QT_QUICK_CONTROLS_STYLE_PATH
Теперь, поскольку стили должны быть найдены в пути импорта QML-движка, как и любой другой QML-модуль, поддержка этого API больше не требуется или невозможна.
Имена стилей
Кроме того, теперь существует только одна допустимая, регистрозависимая форма имён стилей: "Material", "MyStyle" и так далее. То есть: имя стиля должно точно соответствовать имени QML-модуля. Это также относится к селекторам файлов, где ранее все имена стилей были в нижнем регистре. Например, следующая структура была допустимой для проекта Qt 5:
MyProject
├── main.qml
├── HomePage.qml
└── +material
└───HomePage.qml В Qt 6, +material становится +Material:
MyProject
├── main.qml
├── HomePage.qml
└── +Material
└───HomePage.qml Все существующие способы запуска приложения с определённым стилем по-прежнему поддерживаются.
Выбор стиля во время выполнения и во время компиляции
Импорт стиля теперь имеет дополнительное значение из-за того, как работают импорты внутри. Раньше импорт QtQuick.Controls регистрировал типы элементов управления из текущего стиля в QML-движке:
import QtQuick.Controls
Мы называем это выбором стиля во время выполнения, так как стиль выбирается во время выполнения.
Явное импортирование QtQuick.Controls.Material затем просто раскрывает любой дополнительный API, предоставляемый этим стилем (например, присоединённый тип Material):
import QtQuick.Controls.Material
Теперь явное импортирование стиля выполняет оба действия.
Это фактически означает, что типы элементов управления (например, Button) из последнего импортированного стиля будут использоваться. Мы называем это выбором стиля во время компиляции.
Это имеет последствия для существующего кода. А именно, если ваше приложение поддерживает более одного стиля, перенесите эти импорты в свои собственные QML-файлы, которые выбираются по имени файла.
Например, если у вас есть следующее main.qml:
import QtQuick.Controls
import QtQuick.Controls.Material
import QtQuick.Controls.Universal
ApplicationWindow {
width: 600
height: 400
visible: true
Material.theme: darkMode ? Material.Dark : Material.Light
Universal.theme: darkMode ? Universal.Dark : Universal.Light
// Child items, etc.
} Вы можете перенести общий код в компонент "базовый":
// MainWindow.qml
import QtQuick.Controls
ApplicationWindow {} Затем добавьте подкаталог +Material, и в нём добавьте код, специфичный для Material, в MainWindow.qml:
// +Material/MainWindow.qml
import QtQuick.Controls.Material
ApplicationWindow {
Material.theme: darkMode ? Material.Dark : Material.Light
} Сделайте то же самое для Universal:
// +Universal/MainWindow.qml
import QtQuick.Controls.Universal
ApplicationWindow {
Universal.theme: darkMode ? Universal.Dark : Universal.Light
} Затем, в main.qml:
import QtQuick.Controls
MainWindow {
width: 600
height: 400
visible: true
// Child items, etc.
} См. также: Использование селекторов файлов с Qt Quick Controls.
Стиль по умолчанию
Стиль по умолчанию был переименован в "Basic", так как он больше не является стилем по умолчанию. Вместо этого стиль по умолчанию теперь выбирается на основе платформы, для которой был скомпилирован Qt:
- Android: Материальный стиль
- Linux: Fusion стиль
- macOS: Стиль macOS
- Windows: Стиль Windows
- Все остальные платформы: Базовый стиль
Палитра
API палитры был перемещен в QQuickItem. Различные API, использующие палитры в Qt Quick Controls, не изменились.
Элементы управления
Окно приложения
Устаревшие свойства наложения и присоединённый API были удалены. Используйте присоединённый тип Overlay вместо них.
Комбобокс
Свойство pressed теперь является только для чтения. Чтобы изменить визуальное состояние нажатия ComboBox, используйте свойство down вместо этого.
Контейнер
Устаревшая функция removeItem(var) была удалена. Вместо неё можно использовать removeItem(Item) или takeItem(int).
Диалоговое окно
Сигналы Dialog's accepted() и rejected() теперь генерируются до closed() при вызове done(), accept() и reject().
Меню
Устаревшая функция removeItem(var) была удалена. Вместо неё можно использовать removeItem(Item) или takeItem(int).
Подсказка
Таймаут ToolTip теперь начинается только после того, как был выпущен opened(). Это приводит к тому, что всплывающие подсказки с переходами при вводе отображаются в течение всего времени таймаута. Это означает, что они отображаются немного дольше, чем раньше, поэтому может быть целесообразно визуально проверить подсказки в вашем приложении и при необходимости скорректировать таймауты.
StackView
Значение перечисления StackView.Transition было устаревшим. Аргумент операции может быть опущен, чтобы использовать переход по умолчанию для любой заданной операции.
Переключатель
implicitWidth и implicitHeight теперь должны быть предоставлены для Tumbler's contentItem, что обеспечивает согласованность со всеми другими элементами управления.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qtquickcontrols-changes-qt6.html