Qt 6.5 LTS released!
April 03, 2023 by Volker Hilsheimer | Comments
Today we have released Qt 6.5! In the 6th release of the Qt 6 series, we introduce lots of new functionality for graphics and UI developers and the application backend. In addition, Qt 6.5 brings many fixes and general improvements and will be a long-term supported release for commercial license holders.
Let's start with some highlights that Qt 6 applications get practically for free.
Improved theming and styling
With Qt 6.5, applications can easily support dark mode on Windows. On Windows, supporting a dark theme is an explicit choice that an application developer has to make. Implicitly switching an application to dark mode if that application expects window backgrounds to be light could break a lot of user interfaces. But as long as the application uses a style that doesn't override the palette explicitly, such as the Fusion style, Qt will respect the user's choice of color scheme and use the dark system palette. Qt will also configure the title bar and window frame to be in sync with the overall appearance.
In addition, applications can react to changes in the system theme by handling the QStyleHints::colorScheme property change notification.
In Qt Quick Controls, we completed the iOS style, implementing also many controls that don't have an equivalent on native iOS. For applications targeting Android, we have updated the Material style to the Material 3 design system. Applications using the Material style will automatically get a refreshed look. We added a few APIs to allow UI developers to modify certain visual aspects, such as the containerStyle for TextField or TextArea, or the roundedScale for buttons, popups, and drawers.
And on macOS, applications using QMessageBox or QErrorMessage will show the native dialogs with a modern, centred UI design.
Platform improvements, from devices to web
With Qt 6.5, we are adding support for Android 12 while making sure that Qt keeps working as expected on older versions. Even with the significant changes on the platform, a single build of your Qt application can now be deployed to devices running any Android version from 8 to 12 without any changes.
We have upgraded our Boot2Qt software stack for device builders to use the Yocto 4.1 (Langdale) release, which gives access to application development for embedded hardware across many industries. On the Linux Desktop, commercial Qt 6 Debian 11 packages will later on be available via apt
, which makes deploying makes it convenient to deploy commerical Qt applications to debian-based Linux distributions.
Qt 6.5 for WebAssembly follows up on the initial supported release in Qt 6.4 and adds support for video rendering and accessibility for widgets. Qt WebEngine has been updated to Chromium 108, and even includes Chromium 110 security patches. Now it supports hardware accelerated video rendering on Linux under Vulkan for both X11 and Wayland.
Beautiful and performant effects for 2D and 3D
The new Qt Quick Effects module gives Qt Quick UI developers access to ready made graphical effects, which can be combined into a single effect without paying a performance penalty. The interactive Qt Quick Effect Maker tool makes it easy to build and combine complex custom effects. The combination of those technologies replaces the Qt Graphical Effects module from Qt 5 with a solution that performs better, is easier to use, and more flexible to extend.
Qt Quick 3D learned how to automatically and explicitly adjust the level of detail for models, so simplified meshes can be generated and used for objects far away from the camera. With SceneEnvironment's new support for fog, distant objects can also be made to fade out. For more complex post-processing effects, the ExtendedSceneEnvironment allows combining effects, such as depth of field, glow, or lens flare, into a single, high-performant post-processing effect that only requires a single render pass.
Qt everywhere - connectivity everywhere
Communication with web services and data exchange between devices has always been possible with Qt's low-level classes in Qt Network and the higher-level serialization support for JSON and CBOR.
With the new Qt GRPC Qt module, we now add a framework for integration of gRPC and Protocol Buffer technologies in Qt. Qt GRPC allows communication with gRPC services, and with Qt Protobuf, it provides the infrastructure for serializing Qt-based classes. With those modules, developers can define data and messages in protobuf specifications (.proto
) files. Qt integrates the standard tools into the build system to generate C++ types through which applications can communicate with service endpoints.
In Qt Network, we have introduced the capability to configure HTTP 1 connections, and we added a number of CAN bus support classes to the Qt Serial Bus module, providing support for encoding and decoding CAN bus messages, processing frames, and parsing DBC files.
The gRPC, protobuf, and CAN bus additions are all under Technology Preview in Qt 6.5, and we are looking forward to your feedback!
Qt Location back as Technology Preview
The Qt Location module is back in Qt 6.5 as a technology preview. As described a few months ago in a separate blog post, the Qt 6 version of Qt Location takes fewer detours. Rendering of items is now implemented via Qt Quick Shapes, and thanks to the improved QML type system in Qt 6 we have been able to remove a lot of wrapper classes. In this initial release of Qt Location for Qt 6, we only support the Open Street Maps backend. We have removed some of the functionality available through common APIs, but only implemented for a single backend. Refer to the porting guide for a list of API changes.
We have split the Qt Quick Map component into two types: the Map type is responsible for displaying a map but doesn't provide any interactivity. The new MapView type replaces the MapGestureArea
and implements typical interaction features such as pinch-zooming and panning through Qt Quick input handlers.
While the module itself is under technology preview, the GeoJSON support is on par with the rest of the module and no longer experimental.
New functionality in existing modules
Qt 6.5 adds plenty of new features on top of Qt 6.4 and the previous Qt 6 releases, and this blog post focuses on those improvements. Before diving into the details for each module, perhaps this is a good time to point those of you who are still on Qt 5.15 today at the overall feature comparison page.
Qt Core
Many platforms require explicit permission from the user before an application can access certain services. With Qt's new permission APIs, applications can now check and request permission for features that require such consent. In this first release, we include types to ask for permission to access the location, Bluetooth, camera, and microphone capabilities of the device, as well as access to the user's calendar and contacts data.
Qt GUI
Applications that need to exchange platform-specific data formats via the native clipboard can now implement QWindowsMimeConverter and QUtiMimeConverter to support Windows or macOS-specific formats. If you have implementations of QWindowsMime
or QMacMime
in Qt 5, then those will almost directly translate to the new APIs but require less boiler-plate code to register the converters with Qt.
The new setBadgeNumber API in QGuiApplication
makes it easy for applications to inform the user about the number of actionable items, like unread messages, in the dock or taskbar.
And we updated our Vulkan support to use modern underlying infrastructure, added markdown and HTML support for checkable list items, and provided access to the string indexes for a run of glyphs in QTextLayout.
Qt Multimedia
The FFmpeg media backend is now the default for macOS, Windows, Android, and desktop Linux - on embedded systems, GStreamer continues to be the default, but FFmpeg can be enabled explicitly. This backend makes the same functionality available consistently on almost all platforms. The Qt Spatial Audio module is now fully supported after its introduction as a technology preview with Qt 6.4.
As long as the FFmpeg backend is used, Qt applications can now capture the screen using the new QScreenCapture class, which is a new type of video input. The video from a screen recording can be directed through QMediaCaptureSession
for further processing, such as a QMediaRecorder
or QVideoWidget
.
Qt QML and Qt Quick Compiler
One tool of the Qt Quick Compiler, the QML type compiler, qmltc
, supports more QML constructs now, most notably translation bindings, inline components, singletons, and signal handlers. The QML script compiler implemented in the tools qmlcachegen
and in qmlsc
, can now handle more JavaScript constructs, such as output via console
, let
and const
, or string building via arg
. These improvements are available in both editions of the Qt Quick Compiler, the dual-licensed version that is included in Qt 6.5, and in the commercial-only Qt Quick Compiler Extensions add-on. All of this results in the generation of more and better C++ code from QML and JavaScript.
The QML module improvements in Qt 6.5 make it much simpler to create QML elements via their module URI and type name. The support for sequence types has been standardized and extended, with support for methods like map()
, reduce()
, or forEach()
. Value types that have a suitable constructor or are registered as structured types can be instantiated directly from QML. This removes the need for constructor helper functions in singleton C++ types.
Qt Quick and Quick Controls
TableView got support for interactive features such as in-place editing of cells, resizing rows and columns, and multi-selection. TreeView's delegate also supports in-place editing, and the Qt Quick input handlers got a few new properties.
Qt Widgets
QOpenGLWidget now supports stereoscopic rendering as long as the underlying system supports it.
And we have made a few smaller additions to QKeySequenceEdit, which can now be configured to limit the length of a key sequence and to allow the end-user to finish recording a sequence with one or more key combinations.
Other improvements across Qt
In addition to the above, we simplified the QDateTime
and QDate
APIs by folding the time specification into the QTimeZone
; we made it easier to use QBindable
for properties with a notify signal, and give applications more control when working with animations using a BoundaryRule. Positioning-aware applications can use the new SatelliteSource
type directly from QML.
Stability
Qt 6.5 is the second LTS release of Qt 6, and we have added a lot of new functionality in the last 18 months since the Qt 6.2 LTS release. While doing that, we have also fixed a lot of bugs: according to our JIRA bug tracker, we have fixed close to 3500 tickets in that timeframe! And we have also used the time and your feedback to improve the stability of new features. In Qt 6.5, the Qt Quick 3D Physics module we introduced as a technology preview with Qt 6.4 has matured and is now fully supported.
Big thanks to all contributors
I’d like to thank everybody who has helped make Qt 6.5 a reality. You can find a full list of all 286 contributors to the Qt source code at the end of the release notes. And I'd also like to thank all of you who have helped make Qt better by reporting bugs, sending us your feedback, or telling us about your use cases. And last but not least, I'd like to thank all of you who keep our CI and code review systems running.
As always, the new release will be available in the Qt installer. You can also get the release from our download page or your Qt Account page.
Blog Topics:
Comments
Subscribe to our newsletter
Subscribe Newsletter
Try Qt 6.8 Now!
Download the latest release here: www.qt.io/download.
Qt 6.8 release focuses on technology trends like spatial computing & XR, complex data visualization in 2D & 3D, and ARM-based development for desktop.
We're Hiring
Check out all our open positions here and follow us on Instagram to see what it's like to be #QtPeople.
As someone who has been using Qt for years, I am excited about the new improvements in the 6.5 LTS release. The enhanced support for C++20, better documentation, and new features like WebAssembly support are particularly impressive. I'm thrilled to see the release of Qt 6.5 LTS! The new features and improvements are impressive, and I can't wait to start using them in my projects. This latest release is a game-changer for the software industry. The new release comes with enhanced graphics capabilities, better memory management, and faster processing speeds, making it easier for developers to build high-quality applications. The Qt 6.5 LTS release is a testament to the commitment of the Qt Group to constantly improve and innovate. With better integration with modern web technologies, support for new platforms, and enhanced performance, this release is sure to be a hit among developers and users alike.
great :) 6.5 will be my start into the world of Qt 6 for mobile business apps. there's one limitation, my customers will have problems with: Android now is only supported from Android 8 (API 26). currently my customer apps have min Android 5 (API 21) and I warned them that after porting to Qt 6 Android 6 (API 23) will be minimum - have not expected, that now for Qt 6.5 Android 8 (API 26) will be minimum. BTW: Flutter supports from 21 is there any chance to support Android 6 (23) or perhaps Android 7.1 (25)
Also on Mac and Windows and iOS old OS versions are being dropped too quickly. This is done after the LTS so people will buy Qt. I guess this is an effective strategy.
We focus our strategy mainly on the size of the actual user base on a given platform. This applies to any feature release of Qt, not only to an LTS one. On macOS and iOS, the pulse of changes was and is faster indeed, but this pulse is set with platform changes by Apple and not in Qt. Qt always follows changes on a given platform. Generally, a shorter span of supported versions does not have a serious impact on the addressable user base in the Apple ecosystem, since users can upgrade to newer versions on much older devices than, let's say, with Android. For example, Qt 6.5 now supports iOS 14 and newer (BTW, today, we have iOS 16.4 on the market). The oldest device where iOS 14 can be installed is iPhone 6S which has been released in 2015, more than 7 years ago. And still, users can upgrade an iPhone 6S to iOS 15 as well, see https://support.apple.com/en-gb/guide/iphone/iphe3fa5df43/15.0/ios/15.0. My guess is that iOS 15 will be on the list of supported iOS versions in the next feature release of Qt as well, maybe longer, depdending on what Apple announces in the upcoming WWDC 2023. IMHO, it is not soooo bad :-)
the good thing is: when customers must switch to newer Android devices, I'll get less bugreports because of old Android OS, less RAM... ;-) BTW: with iOS never problems - customers always update immediately
Maybe iOS device life-span is lower. Macs and WIndows PCs live longer and often can't be updated.
I just opened Android Studio, and its New Project Wizard told me that I would cover 90.7% of the Android user base if I would choose "API 26: Android 8 (Oreo)" as "Minimum SDK". According this wizard, this share is based on statistics from January this year. The community site https://apilevels.com lists an even larger share for Android 8 and newer. So I'm certain, Qt is in a good shape on this ;-)
Android 8 (Aug. 21, 2017) is quite old and in line with other minimum requirements like Windows 10 version 1809 https://doc.qt.io/qt-6/supported-platforms.html
If you're aiming to develop standard mobile business apps that don't require complex graphics or gaming features for iOS and Android, I'd suggest considering other technologies besides Qt and C++. While Qt is a good framework, it may not be the most efficient option for mobile app development. It can be challenging and require more effort to work around certain issues that are not natively supported by the framework, whereas other frameworks and libraries that use JavaScript and TypeScript may have these features built-in. This could potentially save you time and effort during the development process. Ps: besides the fact that Qt is generally a good choice for mobile app development, it's important to consider some potential drawbacks. For instance, using Qt may require a significant investment of time and resources to master the C++ programming language, as well as tools like CMake and Design Pattern signal and slots. Additionally, licensing fees for Qt technology can be as high as $301 per month, with an additional $120 per month for QDesigner. Therefore, before committing to Qt as your framework of choice, it's important to carefully evaluate its benefits and drawbacks to determine whether it's the right fit for your project. Good Luck
I'm a single independent developer of mobile business apps and really like Qt as my framework. I'm using a commercial version with Qt for Small Business / Startup, where I only have to pay 499$ p.a. (including Designer). This is a really fair price. My mobile business apps are using BT LE devices (Barcode Scanner / Printer, Beacons, WaiterLock and more) or share data with/from other apps. Qt provides me with all I need and it's good to see how much work Qt developers spend on making all the changes requested by new Android or iOS releases. per ex. UI Controls now use Google Material 3, which is state of the art. BTW: I never studied C or C++, but Qt makes it easy to understand and use - there's also excellent documentation. I started with Qt 4.8/BlackBerry 10 and since 2016 I'm developing mobile apps with Qt 5 / QtQuickControls2 for different business domains. Even highly complex apps are running performant, have a great UI/UX and my customers are happy - so I'm too. There's only one Qt5-Qt6.5-transformation-step where I'll need some time learning CMake, but there's much help from Qt Forums or Qt Discord. Looking forward to implement all the new features and refactor my apps to be as much compatible as possible to the new QML compilers. Thanks to all Qt developers fixing reported bugs and developing 6.5 :)
Qt 6 looks more and more promising. Just one question about the gRPC integration. What does it mean for Qt remote objects? It has roughtly the same functionalities but is limited to Qt only while gRPC is cross-languages. Will it get deprecated in a near future?
Both Qt gRPC and Qt Remote Objects are IPC and RPC mechanisms. Still, they both have different use cases, and we do not see them as internal competitors. Alone the fact that gRPC works only via HTTP, ideally HTTP2, but Qt Remote Objects can use any QtIODevice (see the new example for BT LE as a transport layer) makes them very different. Plus, Qt Remote Objects makes Qt objects truly "remoteable". Qt gRPC allows more comfortable use of gRPC and Probuf with Qt, but by nature, it will never be able to achieve this seamless transparency with Qt as Qt Remote Objects does. On the other hand, gRPC is meanwhile a widely used technology in web, embedded, desktop and mobile. We want to make Qt better "connected" with this!
We have no plans to deprecate the Qt RemoteObjects module.
Good, otherwise we would be doomed at work lmao
Yay! 🎉🎉🎉
Thank you for fixing all my bugreports in the last few 6.5 preview versions!
Hi, I have develop a Qt for Android application and I have published in google play but I have recieved e-mail from google :
Starting August 31, 2023: -New apps and app updates must target API level 33 to be submitted to Google Play (Wear OS must target API 30). Existing apps must target API level 31 or above to remain discoverable by all users on Google Play. Apps that target API level 30 or below (target API level 29 or below for Wear OS), will only be discoverable on devices running Android OS same or lower than your apps’ target API level.
The problem is Qt for Android target API level is 30 Please help me
You can set QTANDROIDTARGETSDKVERSION" (https://doc.qt.io/qt-6/cmake-target-property-qt-android-target-sdk-version.html) for CMake, or "ANDROIDTARGETSDK_VERSION" (https://doc.qt.io/qt-6/qmake-variable-reference.html#android-target-sdk-version) for qmake. As for the default version, the current default target version in 6.5 (will be in 6.5.1) is 31. and it will be updated in the upcoming Qt releases to a higher version.
Thanks very much for your great help
For those on Qt5, note that Qt6 has widget rendering artifacts on hi-res displays with a non-integer device pixel ratio (at least under Windows). Most are minor issues, but some cause dropouts (like a missing size grip). These are the bugs I ran into: https://bugreports.qt.io/browse/QTBUG-109638 https://bugreports.qt.io/browse/QTBUG-109640 https://bugreports.qt.io/browse/QTBUG-109641 https://bugreports.qt.io/browse/QTBUG-109730 https://bugreports.qt.io/browse/QTBUG-109713 https://bugreports.qt.io/browse/QTBUG-109715 https://bugreports.qt.io/browse/QTBUG-112019
I was a bit sad that the setBadgeNumber was not implemented for Linux, so i just implemented it for X https://codereview.qt-project.org/c/qt/qtbase/+/470491 and for Wayland https://codereview.qt-project.org/c/qt/qtwayland/+/470496 :)
Awesome, thanks for the contribution! 🥳
Great! Could this also be picked into 6.5.1? So we'll start to use this new feature on all desktop platforms.
I would also like too, but I don't know that qualify as being able to be cherry-picked or that can't.
We have our own styled QMessageBox which we prefer to use, but as of Qt 6.5, we're now getting the native message box instead of our custom styled one on macOS. Is there an application attribute we can use to tell Qt we prefer to use our styled message box instead of the native one?
You can set QCoreApplication::testAttribute(Qt::AA_DontUseNativeDialogs)
Thanks for this great release! I have one question, I have looked at the Qt Protobuf API, it seems it only supports binary format for messages. Would this be possible to also add serialization / deserialization from JSON, as provided by the Protobuf library using google::protobuf::util::JsonStringToMessage and google::protobuf::util::MessageToJsonString ?
Best Regard!
Are the Qt Quick Compilers out of technology preview? I'm really looking forward to use them...
The Qt Quick Compilers consist of two parts: The QML script compiler (https://doc.qt.io/qt-6/qtqml-tool-qmlsc.html) is out of TP, both the open source part and its commercial extensions. In fact,i f you're using the qtaddqml_module CMake API, you're already using it by default (since 6.3 I believe).
The second part is the Type Compiler. While 6.5 has lifted already some of the limitations it had compared to 6.4 (currently only reflected on https://doc-snapshots.qt.io/qt6-6.5/qtqml-tool-qmltc.html, but should soon appear on the non-snapshot documentation page), we still want to keep it in TP until we have an easier integration available which doesn't require making all of your code compatible with the type compiler.
What is the situation with the support for Wayland fractional scaling on GNU/Linux? Is this already included in this release or is it planned for a later release?
fractional scale v1 is supported on the client side, but it also requires compositor support in order to be activated. I believe it has been supported by KDE since Plasma 5.27. I am not sure about other desktop compositors, but it is not supported by the Qt Wayland Compositor API yet.
I am all excited about 6.5 -- thanks for all your work. Still, I wonder: is there a defined pathway for the maplibre plugin to come back? Or are there instructions how to compile it myself? -- My Android app heavily depends on maplibre, so I cannot upgrade to Qt6.5 before I have found a solution for this…
There is a port of the Qt5 (back then Mapbox) plugin to Qt6.5 (now Maplibre) on the codereview server: https://codereview.qt-project.org/c/qt/qtlocation/+/382087
I was able to compile the plugin after compiling MapLibre from source (see comment in the link above) and use it in one of the examples. Feel free to try it and ask me if you have questions. Your feedback would be very appreciated!
Thank you for your prompt reply! I will look at the port and report on my experiences. I am, however, on vacation right now, so I will need a few days.
Is there a way to revert to Material 2? I’d like to upgrade to Qt 6.5 without my UI changing
No, as that would require maintaining two versions of the Material style.
I just tried copying the Material style from 6.4.3 to 6.5.0, to see if it would work, but it doesn't:
The closest would be to revert the changes done for QTBUG-97993 and its sub-tasks, and build Qt yourself.
Another alternative is to tweak roundedScale, padding, etc. of the various controls to get them closer to Material 2, but that will only get you so far, and won't work for all controls.
"On the Linux Desktop, commercial Qt 6 Debian 11 packages are available via apt, " but when i click on the link there are only Qt 6.3 packges for Ubuntu 20.4 shown. Where can I find the Debian 11 Qt6.5 LTS packages?
@Gunnar: Thanks for the question. These are actually not yet available, but planned to come on a later Qt 6.5.x patch release. I modified the blog post about this. For details, see: https://doc.qt.io/qt-6/qt-debian-packages.html
Great work by Qt has been done. Thank you! I would love to get the source code of the table presented in this article. Is it available somewhere?
"Qt 6.5 for WebAssembly follows up on the initial supported release in Qt 6.4 and adds support for ... accessibility for widgets"
vs.
" Known Issues ... Accessibility is not supported: Qt draws application content to a canvas element and does not use (other) native DOM elements. " Ref.: https://doc.qt.io/qt-6/wasm.html#known-issues
Which one is true? :)
Accessibility is supported with Qt 6.5 on Web Assembly. Thanks for spotting the outdated statement in the known-issues list!
In Qt Quick Controls, we completed the iOS style, implementing also many controls that don't have an equivalent on native iOS. For applications targeting Android, we have updated the Material style to the Material 3 design system. Applications using the Material style will automatically get a refreshed look. We added a few APIs to allow UI developers to modify certain visual aspects, such as the containerStyle for TextField or TextArea, or the roundedScale for buttons, popups, and drawers.
"Qt 6.5 for WebAssembly follows up on the initial supported release in Qt 6.4 and adds support for video rendering"
I tried it (with a short AVI file bundled via Qt's resource system) using the QML Video object : https://doc.qt.io/qt-6/qml-qtmultimedia-video.html#details
But the video only plays when I target native OS platform (macOS in my case). For WebAssembly the video doesn't play.
I see the following in the Javascript console : " virtual void QWasmMediaPlayer::setMedia(const QUrl &, QIODevice *) QUrl("file:///tmp/this.program.fdtBYL.avi") true false ... no local files allowed, so we need to blob "
Is there any way to fix this?
Browsers restrict loading local resources, it has to be served from http(s). That debug output is a bit unfortunate and not very helpful.
Is there a migration guide for existing applications? I'm encountering some minor bumps regarding modules, singletons and the like.
Thanks...
@Michael: We have a porting guide available that may help: https://doc.qt.io/qt-6/portingguide.html
In a typical case the steps are: 1. Migrate to Qt 5.15 (in case you are using an earlier version of Qt) 2. Enable deprecation warnings and fix them 3. Build with Qt 6
This typically gets one quite far, but I assume you have already done these. So if you can't find the answers in the porting guide, check out https://forum.qt.io and in case you have found a bug, file one at https://bugreports.qt.io.