Qt Migration From Qt 5 to Qt 6
Your application runs on Qt 5, and the Qt 6 question is now arriving from several directions at once – the new SoC, the support calendar, the security review. We take this migration on as a project in its own right: a defensible effort assessment before you commit, then a move made in stages that each stay runnable and testable. Your development does not stop while it happens. On embedded targets we also cover what stays invisible on the desktop: the rebuilt graphics stack and the BSP underneath it.
What does a Qt migration with bitshift cover?
We take on the whole path from Qt 5 to Qt 6 – or exactly the stage where it is currently stuck.
- Effort assessed up front through a time-boxed spike, with named items rather than a flat rate
- Modernization on Qt 5.15 with deprecation warnings cleared – the most effective and most frequently skipped stage
- Moving the build from qmake to CMake as a separate, independently verifiable step
- The switch to Qt 6 with Qt5Compat as a bridge, followed by retiring the transitional dependencies
- Replacing what was removed – Qt Quick Controls 1, modules rewritten for Qt 6 such as Qt Multimedia,
QRegExpandQTextCodec - Graphics stack and platform plugin verified on the target, not only in the desktop build
- A safety net of automated tests, on request through our Embedded Testrack on real hardware
Why does the migration come up at all?
The pressure rarely comes from a support calendar. It almost always comes from hardware.
Qt 5.15 was the last Qt 5 version with long-term support; its open-source support has ended and commercial terms change over the years – check the current state directly with The Qt Company. The actual trigger, though, is usually a new SoC: it brings a newer Yocto release, which brings a newer compiler and newer system libraries, and at some point an old Qt 5 no longer builds cleanly inside it. Waiting until then means migrating under time pressure alongside a board bring-up. That is the most expensive possible order.
How does the migration run?
In five stages, each of which stays runnable on its own – the most common misstep is switching Qt version, build system and compiler at the same time.
| Stage | Work | Result |
|---|---|---|
| 1 | Move to Qt 5.15, clear deprecation warnings | Running application free of outdated calls |
| 2 | Move the build to CMake – still on Qt 5 | Build change verified in isolation |
| 3 | Switch to Qt 6 with Qt5Compat as a bridge | First running Qt 6 version |
| 4 | Retire Qt5Compat, move QML to versionless imports | No transitional dependencies left |
| 5 | Validate graphics stack and platform plugin on target | Confirmed behaviour on the real device |
Because a working state exists after every stage, any failure that appears has only one plausible cause. The technical background is covered at length in our article on migrating from Qt 5 to Qt 6.
What do embedded targets add?
On the desktop a migration ends at a green build. On a device that is where the real test starts.
In Qt 6, Qt Quick no longer renders directly against OpenGL but through the RHI, an abstraction over each platform’s graphics API. On the desktop this is barely noticeable. On a board with EGLFS, a vendor-specific EGL and a GPU driver whose quirks the team has learned over years, that is exactly where the time goes. Then there is the BSP: the Qt 6 layer has to match the board’s Yocto release, and jumping several Yocto releases drags kernel, toolchain and system libraries along. How we build and maintain such layers is described under Yocto BSP & distributions.
The difference from a pure Qt shop: because we already own the embedded Linux platform underneath, the BSP question is part of the engagement for us rather than an interface at which responsibility ends.
What does a Qt migration cost?
A defensible number only exists after the spike – before that it would be a guess.
Four questions drive the effort. How much QML is there, and does it depend on Qt Quick Controls 1? Does the application use modules that were rewritten for Qt 6, Multimedia above all? How idiosyncratic is the target hardware’s graphics stack? And do automated tests exist that would make a regression visible at all? We settle that in a first step of contained size and then put an assessment with named items in front of you. You decide on that basis whether and how far it continues.
Why bitshift dynamics for your Qt migration?
Because the Qt knowledge and the embedded depth come from the same team.
We have worked on hardware-near software since 2005 and cover C++, Qt/QML, embedded Linux and Yocto together – which is why a migration with us does not get stuck at the graphics stack or the BSP. We are based in Lörrach on the German-Swiss-French border, work remote-first and on-site across the DACH region when needed, in German and in English. If your team would rather carry out the migration themselves, that works too: we then come along as a sparring partner, or through a matching training.
Frequently asked questions
- How do we know the size of our migration before committing to it?
- From a time-boxed spike, not from a line count. We run the first stages on a branch – modernizing on Qt 5.15 and moving the build – and take the rest just far enough for the application to start under Qt 6. After that the remaining work can be named: how much QML there is, whether the UI rests on Qt Quick Controls 1, whether modules rewritten for Qt 6 are in play (Qt Multimedia above all), and how idiosyncratic the target's graphics stack is. You get an assessment made of concrete items rather than a ballpark figure.
- Can we keep working on the product during the migration?
- Yes, and the staged approach exists precisely for that. Every stage ends with a running application, so the main branch stays shippable throughout. The most substantial stage – modernizing on Qt 5.15 with deprecation warnings cleared – happens entirely under Qt 5 and can be folded into normal development.
- Do we have to move from qmake to CMake?
- Applications can still be compiled with qmake. Qt 6 itself, however, is built with CMake, and the documentation, tooling and examples all target it – every extension leads back there sooner or later. If you are migrating anyway, doing the build switch in the same round is the cheapest option. We make it a stage of its own, still under Qt 5, so that a failure afterwards can only have one cause.
- What is different on embedded devices compared to the desktop?
- The graphics stack and the BSP. In Qt 6, Qt Quick renders through the RHI abstraction rather than directly against OpenGL, so assumptions about EGL, drivers and the platform plugin have to be re-checked. On top of that, the Qt 6 layer has to match the board's Yocto release. We deliberately run the Qt migration and the BSP update as two separately verified steps; it looks like more work and is markedly cheaper in practice.
- We inherited a Qt application with no tests. Is that still workable?
- Yes – that is closer to the norm than the exception. A migration changes very little in a thousand places and a great deal in a few, and without tests it stays open which of the two you just hit. So we start by building a narrow safety net around the critical paths. On real hardware our Embedded Testrack takes that over, so a regression in the graphics or input path surfaces immediately rather than at the customer site.
- Will you take over a migration that has already stalled?
- Yes. A common pattern is that the Qt version, the build system and the compiler were all changed at once and there is no longer a working intermediate state. In those cases we first re-establish a defined starting point, then fit the work back into the staged sequence rather than pushing the half-finished conversion further ahead.
Articles on this topic
How we work and what matters in practice – from our blog.
Migrating From Qt 5 to Qt 6: A Roadmap for Embedded Projects
How to make a Qt 5 to Qt 6 migration predictable in embedded projects: qmake to CMake, Qt5Compat, the new RHI-based graphics stack, and the sequence that keeps risk low.
- Qt
- Qt 6
- Migration
Qt for Embedded: What It Really Takes on Real Hardware
Qt for Embedded Linux, Qt for MCUs or plain cross-compiled Qt? What the term covers, what EGLFS and hardware acceleration demand, and where boot time goes.
- Qt
- QML
- Embedded Linux
Modern C++ (17/20/23) for Embedded Systems
How C++17, C++20 and C++23 make embedded software safer and clearer at little to no runtime cost — applied with discipline for constrained targets.
- C++
- Modern C++
- Embedded
Related services
Qt & QML Applications
Cross-platform desktop and HMI applications with Qt and QML – from the first UX sketch to a fluid, hardware-accelerated interface.
Learn more →Embedded Linux
From board bring-up to application: reliable Embedded Linux systems focused on stability, boot time and long-term maintainability.
Learn more →Embedded Testrack
Real CI/CD with real hardware: we integrate your embedded systems into an automated test rack and validate every release through the actual input and output interfaces – 24/7, without simulated mockups.
Learn more →C++ Software Engineering
High-performance, maintainable C++ software – from architecture to delivery. Modern C++ (17/20/23), clean design and solid test coverage.
Learn more →Let's talk about your project
Whether it's a new product, modernizing an existing application, or a bottleneck in your team – we look forward to hearing from you.
Start a project