Spec-Zone.ru › Qt 6.1

Изменения в 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.

Стиль по умолчанию

Стиль по умолчанию был переименован в «Базовый», поскольку он больше не является стилем по умолчанию. Вместо этого стиль по умолчанию теперь выбирается в зависимости от платформы, для которой был скомпилирован Qt:

  • Android: Стиль Material
  • Linux: Стиль Fusion
  • macOS: Стиль macOS
  • Windows: Стиль Windows
  • Все остальные платформы: Стиль Basic

Палитра

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).

Подсказка

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

StackView

Значение перечисления StackView.Transition устарело. Аргумент operation можно опустить для использования по умолчанию перехода для любого заданного действия.

Переключатель

implicitWidth и implicitHeight теперь должны быть указаны для Переключателя's contentItem, что обеспечивает согласованность со всеми другими элементами управления.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qtquickcontrols-changes-qt6.html

Spec-Zone.ru

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