Qt 6.0. Это первый выпуск новой основной версии который знаменует собой важную ветку для Qt. Работать над первоначальными идеями начали несколько лет назад, и с тех пор приложили огромные усилия для создания следующего поколения Qt.
Основной перечень изменений:
- Использование C++ 17;
- QML нового поколения;
- Новая графическая архитектура;
- Унифицированные 2D и 3D для Qt Quick;
- Система сборки CMake (qmake по-прежнему поддерживается);
Удалили много устаревших методов. Страницы документации Qt 6, автоматически создаваемые QDoc на основе кода, включают списки с устаревшими классами и новыми классами и функциями.
Qt Concurrent
QtConcurrent::run() имеет следующие улучшения:
- Теперь он работает с переменным числом аргументов;
- Он обеспечивает доступ к объекту promise, связанному с данной задачей, в методе run(). Это позволяет создавать отчеты о ходе выполнения, сообщать о нескольких результатах, приостанавливать или отменять выполнение run();
- Все методы QtConcurrent были усовершенствованы, чтобы идеально переслать переданные параметры и избежать дополнительных копий;
- В QtConcurrent добавлен новый метод QtConcurrent:: task(), который обеспечивает быстрый интерфейс для запуска задачи в отдельном потоке;
Qt Core
Изменение в классах View
- Теперь QByteArrayView предоставляет легкий способ просмотра содержимого QByteArray или других данных массива, эквивалентных символам;
- QStringView получил несколько улучшений API
- QUtf8StringView ссылается на смежную часть строки UTF-8 без необходимости построения QString или QByteArray;
- QAnyStringView ссылается на строки любой из следующих кодировок: UTF-8, UTF-16 и Latin-1;
- QStringRef был перемещен в новый модуль Qt Core5Compat.
QPromise позволяет устанавливать значения, ход выполнения и исключения для QFuture;
QFuture поддерживает продолжение присоединения;
QStateMachine был удален из Qt Core и вернется в более поздних выпусках Qt (скорее всего, в составе модуля Qt SCXML);
Теперь сигналы могут быть преобразованы в объекты QFuture;
QVector и QList унифицированы. QList обновляется и должен использоваться по умолчанию, когда необходимо поведение в виде массива;
QList, QString и QByteArray теперь имеют оптимизированную сложность вставки в начале (a.k.a. предварительно ожидать);
Упрощен механизм Q_DECLARE_TYPEINFO():
- Тривиально копируемые и тривиально разрушаемые типы автоматически рассматриваются как перемещаемые (Q_RELOCATABLE_TYPE)
- Q_MOVABLE_TYPE и Q_RELOCATABLE_TYPE означают одно и то же;
Классы контейнеров теперь используют qsizetype в качестве базового типа для размера и индексирования. Кроме того, несколько связанных классов были обновлены аналогичным образом (например, QTextFortedFinder и QRegingExpression). Это изменение позволяет контейнерам хранить более 2 ^ 31 элементов на 64-разрядных платформах;
Улучшения QLocale, а именно форматирования номеров;
QHash и связанные с ним классы были улучшены:
- Для пользовательских типов QHash и QMultiHash полагаются на предоставление пользовательской функции qHash() в одном пространстве имен. В Qt 4 и Qt 5 возвращаемое значение и необязательный второй аргумент функции qHash имели тип uint. В Qt 6 это size_t;
- Реализация QHash и QMultiHash в Qt 6 была изменена с узлового подхода на двухэтапную таблицу поиска;
- QMullHash больше не является производным QHash. QHash::insertMulti() был удален.
Перегрузка QProcess::start(), которая интерпретирует одну командную строку, разделяя ее на имя программы и аргументы, переименовывается в QProcess::startCommand();
Система мета-типов и QVariant были усовершенствованы. Основные моменты включают возможность создания QMetaType во время компиляции из любого типа, более быструю унификацию обработки встроенных и пользовательских типов, а также QVariant.
Qt DBus
- QDBusPendingReply был изменен, чтобы быть классом различных шаблонов и поддерживать более 8 параметров шаблона;
- Функция QDBusConnection::sender() удалена.
- Перегрузки QDBusArgument::operator<<() для QHash, QMap и QList были объединены в общие специализации для ассоциативных контейнеров;
- Методы QDBusMessage::call() и QDBusMessage::asyncCall() с фиксированным размером аргументов удалены.
Qt Gui
- QPageRanges - это новый класс, который помогает управлять коллекцией диапазонов страниц при печати;
- Теперь анализатор разметки по умолчанию отличает _underlined_ текст от * подчеркнутого * (курсивного) текста. Старое поведение (с использованием курсива для обоих) можно восстановить, пропустив флаг FeatureUnderline.
Улучшения входящих событий
В прошлом события мыши, планшета и прикосновения были совершенно разными, потому что только сенсорные экраны являются мультисенсорными, и поэтому только QTouchEvent мог нести несколько точек прикосновения; в то время как планшетные устройства имеют другие возможности. Теперь мы провели рефакторинг событий указательного устройства, чтобы дополнительно иметь общий API, чтобы можно было написать код обработки агностических событий устройства. Это обеспечивает основу для более единообразной обработки событий в Qt Quick.
QPointterEvent - это новый класс, который предоставляет общий API для входных событий от устройств ввода на основе указателей, таких как мыши, планшеты или сенсорные экраны.
QSingleStartEvent - новый подкласс, предоставляющий общий набор средств доступа к входным событиям от одноточечных устройств: то есть всех устройств, кроме сенсорных экранов. Теперь QMouseEvent является тривиальным подклассом QSingleStartEvent.
- QEventPoint хранит информацию об отдельной точке события. QTouchEvent содержит несколько экземпляров; Событие QSingleStartEvent содержит один экземпляр.
- Класс QInityDevice представляет устройство, с которого происходит каждое входное событие, причем QPointerDevice специализируется на устройствах ввода на основе указателей. QInputEvent имеет метод доступа к device(). Так, например, когда событие мыши синтезируется из события касания или планшета, можно увидеть, что оно поступило от конкретного устройства, а не от одной "основной" мыши. В будущем мы намерены развивать поддержку использования нескольких устройств ввода одновременно: тогда еще важнее будет отличить ввод от разных устройств.
- Каждый плагин платформы несет ответственность за создание экземпляров устройств по мере их обнаружения. Известный набор устройств можно получить из QInputDevice::devices();
Классы перемещенные из QtWidgets в QtGui
Несколько классов, которые обычно полезны для разработки пользовательского интерфейса и не имеют сильной зависимости от QWidget, были перемещены в модуль QtGui:
- QAction and QActionGroup;
- Классы из инфраструктуры Undo/Redo, такие как QUndoCommand и QUndoStack;
- QShortcut
- QFileSystemModel
Qt Network
- Сигнал error() в QAbstractSocket был заменен на errorConsented(). Это позволяет избежать неоднозначной перегрузки функций;
- Несколько устаревших функций из QSslSocket были удалены. Вместо него следует использовать QSslConfiguration;
- Модуль управления носителями и, в частности, классы QNetworkConfiguration и QNetworkStartManager были удалены. Следовательно, функции, связанные с управлением носителями, также были удалены из QNetworkStartManager;
- Политика перенаправления по умолчанию изменена с ручной на QNetworkRequest:: NoLessSafeRedirectPolicy;
- По умолчанию QNetworkStartManager включает протокол HTTP/2.
Qt QML
Система импорта и управления версиями QML была переработана:
- Номера версий необязательны на языке QML. Импорт без номера версии импортирует последнюю версию модуля. Импорт только с основным номером версии импортирует модуль с указанной основной версией и последней младшей версией;
- QML поддерживает "автоматический" импорт: вместо указания номера версии можно записать import < модуль > auto. В этом случае импортированный модуль импортируется в той же версии, что и импортируемый модуль;
- qmlRegisterModityImport() может использоваться для процедурного импорта модулей (фактически выполняя то же самое, что и инструкция импорта в файле qmldir);
QJSEngine был усовершенствован:
- QJSEngine::evaluate имеет новый, дополнительный параметр stackTrace. Его можно использовать для проверки того, происходит ли возвращенное значение QJSValue из непроверенного исключения, и для извлечения обратной трассы выполнения, приводящей к ошибке.
- Функции владения статическими объектами доступны в QJSEngine, а не только в QQmlEngine.
Улучшена обработка цветов в QML
- Функция Qt.color может использоваться в QML для преобразования цветовых строк в фактические цветовые объекты.
- Язык QML получил функцию Qt.alpha для изменения альфа-значения цвета
- К цветовому объекту QML добавлены более темные, светлые и оттеночные функции.
Поведение переопределения QQmlListProperty в производных классах может быть изменено.
XmlHttpRequest: Теперь можно задать заголовок User-Agent.
Некоторое устаревшее поведение было удалено в Qt 6.0. Дополнительные сведения см. в руководстве по портированию.
Qt Quick
Qt Quick scenegraph теперь функционирует на Vulkan, Metal и Direct3D 11, в дополнение к OpenGL и OpenGL ES.
- API с прямыми зависимостями OpenGL заменяются новыми альтернативами, которые функционируют вместе со всеми поддерживаемыми графическими API. Это влияет главным образом на ряд функций-членов в QQuickWindow, QSGTexture и QSGMatingShader.
- Система материалов Qt Quick scenegraph была изменена для размещения графических API, отличных от OpenGL. QSGMatingShader имеет совершенно новый интерфейс, который должен быть реализован подклассами.
- QQuickRenderControl имеет расширенный API и дополняется новыми вспомогательными классами QQuickRenderTarget, QQuickGraphicalDevice и QQuickGraphicalConfiguration, которые обеспечивают лучший контроль над QQuickWindow и базовым графическим стеком.
QQuickWindow имеет ряд новых сигналов, таких как beforeRenderPassRecording() или beforeFrameBegin(). Они дополняют существующие сигналы, такие как beforeRendering(), и позволяют приложениям выполнять собственный рендеринг Vulkan, Metal, D3D или OpenGL до или после того, как Qt Quick Scenegraph выполнит рендеринг своей сцены.
Шейдеры вершин и фрагментов в ShireEffect и QSGMatingShader обрабатываются с помощью нового унифицированного конвейера шейдеров, что позволяет записывать шейдеры один раз, одновременно работая с любым из поддерживаемых графических API во время выполнения. Теперь приложения должны использовать инструменты из модуля Qt Shader Tools для подготовки (компиляции, отражения и трансляции) кода шейдера в автономном режиме или во время сборки.
Средство визуализации Qt Quick scenegraph теперь может функционировать в режиме, совместимом с перспективными проекциями, что позволяет выполнять визуализацию комбинированных 2D-3D сцен за один проход визуализации.
Qt Quick 3D
Портирован на новые общие графические абстракции в Qt 6.0.
- В Qt 6.0 все, что в этом отношении относится к Qt Quick (например, настройка используемого графического API), также относится к Qt Quick 3D. Средство визуализации сцены 3D подключается к Qt Quick, используя ту же инфраструктуру рендеринга, в отличие от Qt 5.15, где рендеринг происходил в отдельных мирах, переходя непосредственно к OpenGL.
Более унифицированные сцены 2D-3D.
- Сцена 3D может содержать произвольные поддеревья Item (QQuickItem), которые затем визуализируются непосредственно средством визуализации Qt Quick scenegraph, используя соответствующие преобразования и проекции, без необходимости выполнения отдельного прохода рендеринга в какой-либо другой объект рендеринга.
Улучшенная точность визуализации
- Улучшенный PrincipledMaterial::assets с потоком обработки металлическими шероховатостями теперь ближе к тому, что задумал дизайнер.
- Улучшенная обработка цвета (линейная по сравнению с sRGB), с правильной подстановкой цветов.
Пользовательская система материалов была полностью переработана. API CustomMaterial и способ записи связанных фрагментов шейдера имеют серьезные изменения в Qt 6.0. См. также страницу начала работы.
Эффекты постобработки были перенесены на подход обработки шейдеров, который следует тем же шаблонам, что и CustomMaterial, что упрощает написание пользовательских эффектов.
Параметры текстуры (фильтрация, mipmaps) теперь настраиваются через QML API.
Добавлен API C++ для процедурной генерации данных изображения для текстур.
Обновлена пользовательская геометрия C++ API.
Документация была в значительной степени обновлена. Также добавлена документация по архитектуре и руководства по началу работы.
Qt Quick Controls
- Добавлены стили рабочего стола macOS и Windows.
- Стиль, подходящий для целевой платформы, теперь выбирается, если не указан ни один стиль. Для поддержки этого стиля стиль "По умолчанию" был переименован в "Базовый".
- Выбор стиля времени компиляции теперь поддерживается путем явного импорта стиля.
Добавлен implicitContentWidthPolicy в ComboBox, который управляет расчетом implicitContentWidth. Это может использоваться для автоматической проверки того, что текст не учитывается.
Qt SQL
- Тип возвращаемого значения для boundValues() изменен с QMap < QString, QVariant > на QVariantList;
- QSqlField теперь использует QMetaType для определения типа поля вместо QVariant::Type.
Qt TEST
Функции QTest:: QTouchEventSequence, использующие параметр QWidget, перемещены в новый класс QTest:: QTouchEventWidgetSequence;
Qt XML
- Классы SAX удалены. Используйте QXmlStreamReader для чтения XML-файлов.
Qt SVG
Классы в модуле QtSvg, которые зависят от QtWidgets, были перемещены в отдельную библиотеку QtSvgWidgets, поэтому теперь можно использовать большую часть функциональности QtSvg в приложениях на основе Qt Quick без использования зависимости QtWidgets.
Qt OpenGL
- Для приложений, требующих интеграции с OpenGL, модуль OpenGL содержит классы удобства, чтобы сделать этот тип интеграции более простым и быстрым. Классы, зависящие от QtWidgets, находятся в отдельной библиотеке QtOpenGLWidgets, так что приложения на основе Qt Quick могут использовать удобные классы для интеграции с OpenGL без использования зависимости QtWidgets.
- Qt OpenGL теперь содержит классы QOpenGL* из Qt Gui в Qt 5. Устаревший набор классов QGL* удален.
Qt Widgets
- Несколько независимых от виджетов классов были перемещены из QtWidgets и в QtGui (см. выше)
- В системе с несколькими дисплеями используйте QWidget::setScreen, чтобы указать, на каком дисплее должен отображаться виджет; класс QDesktopWidget удален.
Qt PrintSupport
API в модуле Qt PrintSupport были консолидированы и очищены для повышения согласованности
Новые модули
Qt5Compat
- Библиотека совместимости, предоставляющая доступ к устаревшим API, удалена в Qt 6.
QtShaderTools
- Инструменты и API для подготовки графики и вычислительных шейдеров к использованию в новом стеке графики
Изменения платформы
- Qt теперь собирается с помощью CMake.
- Масштабирование Qt High DPI теперь активировано по умолчанию; политика округления по умолчанию - PassThrough
- Теперь API, специфичные для платформы, доступны через новый API собственных интерфейсов
Android
- Переименовано имя пакета Java из org.qtproject.qt5.android в org.qtproject.qt.android. Вместо этого номер версии будет иметь имя файла * .jar.
- Используйте демон Gradle для построения приложений Android.
- Установите для исходных и целевых версий Javac по умолчанию значение 8 и разрешите настройку из сценария настройки.
- Минимальный уровень API Android составляет 23 для Qt 6.
- Для перехода приложений Android в режим погружения выполните команду UsingUsingFullscreenGeometiveHint.
- Исправления для андроид тест раннера и выполнения тестов QML.
Удаленные модули
Следующие модули удалены и не планируются к дальнейшей разработке. Другие модули, не входящие в состав Qt 6.0, рассматриваются для поддержки кандидатами более поздних выпусков Qt 6.x или в качестве дополнительных библиотек поверх базового выпуска Qt.
- Qt Multimedia Widgets
- Qt Graphical Effects
- Qt Purchasing
- Qt Quick Extras
- Qt Quick WebGL
- Qt Script
- Qt XML Patterns
Дополнительные модули, доступные через диспетчер пакетов
- Qt Image Formats
- Qt 3D
- Qt Network Authorization