Spec-Zone.ru › Qt

Изменения в 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 vs 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: Стиль Material
  • Linux: Стиль Fusion
  • macOS: Стиль macos
  • Windows: Стиль Windows
  • Все остальные платформы: Стиль Basic

Поэтому приложениям, которые не указывали стиль в Qt 5 и настраивали элементы управления, следует явно указать стиль Basic в Qt 6, чтобы гарантировать, что эти элементы управления выглядят и ведут себя так же, как и в Qt 5.

Палитра

API палитры был перемещен в QQuickItem. Различные API, использующие палитры в Qt Quick Controls, не изменены.

Элементы управления

Окно приложения

Устаревшие свойства наложения и присоединённый API были удалены. Используйте присоединённый тип Overlay вместо этого.

Комбобокс

Свойство pressed теперь является только для чтения. Чтобы изменить визуальное состояние нажатия ComboBox, используйте свойство down вместо этого.

Контейнер

Устаревшая функция removeItem(var) была удалена. Вместо этого можно использовать removeItem(Элемент) или takeItem(int).

Диалоговое окно

Сигналы Dialog's accepted() и rejected() теперь генерируются до closed() при вызове done(), accept() и reject().

Меню

Устаревшая функция removeItem(var) была удалена. Вместо этого можно использовать removeItem(Элемент) или takeItem(int).

Подсказка

Подсказка's таймаут теперь начинается только после выдачи сигнала opened(). Это приводит к тому, что подсказки с переходами входа видны в течение всего времени таймаута свойства. Это означает, что они видны немного дольше, чем раньше, поэтому возможно стоит визуально проверить подсказки в вашем приложении и скорректировать таймауты при необходимости.

Просмотр стека

Значение перечисления 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.2/qtquickcontrols-changes-qt6.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API