After you land on Qt 6, the next architecture fork is usually which UI technology owns the screen: Qt Widgets or Qt Quick / QML. Pick wrong and you pay in rewrites, hiring, and tooling. Pick well and your C++ core stays stable while the UI matches the product you actually ship.
Official Qt frames the split clearly: Qt Quick is for fluid, dynamic, touch-friendly interfaces; Qt Widgets are for complex, traditional desktop applications (User Interfaces). This guide turns that comparison into a decision framework, checklists, and hybrid warnings you can take to a design review.
Free practice material while you decide: download the Qt 6.9 book examples ZIP, skim the free English Chapter 1 — Qt class hierarchy overview (also as class hierarchy overview), and if you just finished a port, cross-link your notes to the sibling pillar Qt 5 to Qt 6 Migration Checklist. German readers can start with the DE tutorial on the first program and Qt modules.
Table of contents
- Why this choice matters in 2026
- What “Qt Widgets” and “QML / Qt Quick” actually mean
- Official comparison at a glance
- Decision framework: score your product
- Choose Qt Widgets when…
- Choose Qt Quick / QML when…
- Hybrid apps and QQuickWidget: useful, not free
- Team skills, tooling, and CMake
- Printable decision checklist
- FAQ
- Next free steps
Why this choice matters in 2026
Qt 6 keeps both stacks first-class. That is good news and a trap. Marketing pages sometimes imply “everything is QML now.” Production reality is different: line-of-business desktops, IDEs, and admin tools still ship heavily on Widgets, while automotive HMI, medical panels, kiosks, and branded consumer UIs lean Qt Quick.
Three reasons to decide deliberately:
- Architecture: Widgets are imperative C++ UI trees. Qt Quick is a declarative scene graph driven by QML (and usually a C++ backend). Mixing without a plan creates two UI cultures in one repo.
- Graphics: Qt Quick is GPU-accelerated via the Scene Graph / RHI path by default. Widgets primarily paint with software/
QPainter(OpenGL widgets exist but are isolated). See the official comparison table (User Interfaces). - Hiring and velocity: A C++-only desktop team ramps faster on Widgets. A product with designers iterating on motion and layout ramps faster on QML—if you also plan C++ integration.
If you are mid-port, finish the migration checklist first, then lock the UI strategy before you invest in new screens.
What “Qt Widgets” and “QML / Qt Quick” actually mean
Qt Widgets are the classic desktop controls: buttons, menus, dock widgets, dialogs, QTableView / QTreeView, and friends. You write most UI in C++ (or load .ui files from Qt Designer). The look integrates with Windows, Linux, and macOS desktop conventions (Qt Widgets overview; User Interfaces).
Qt Quick is the runtime and scene graph for modern UIs. QML is the declarative language you use to describe those UIs. Qt Quick Controls supplies ready-made buttons, dialogs, and menus in QML. You typically keep business logic and performance-critical code in C++, and expose it to QML (User Interfaces).
Jargon once, then we move on:
| Term | Plain meaning |
|---|---|
| QML | Declarative UI language (plus optional JavaScript for light logic). |
| Qt Quick | Engine + scene graph that renders QML. |
| Qt Quick Controls | Standard control set for Qt Quick apps. |
| Widgets | Classic C++ desktop widget toolkit. |
| RHI | Qt’s Rendering Hardware Interface behind modern Quick graphics. |
Official comparison at a glance
Qt’s own feature matrix is the best neutral baseline. Condensed from User Interfaces — Comparison of UI Technologies:
| Concern | Prefer Qt Quick / QML | Prefer Qt Widgets |
|---|---|---|
| Primary languages | QML + JavaScript (+ C++ backend) | C++ (+ Designer .ui) |
| Fluid animation / transitions | Built for GPU-accelerated motion | Possible via QPropertyAnimation, not the design center |
| Touch and gestures | Designed for touch / multimodal input | Mouse/keyboard first; touch needs more work |
| Dense desktop chrome (docks, MDI-style tools) | Possible, but more custom work | Mature out of the box |
| Hardware-accelerated full-scene graphics | Scene Graph / GPU path | Software by default; OpenGL widgets are isolated |
| Rich text editors | Possible with more C++ glue | Mature QTextDocument / QTextEdit stack |
| Rapid visual prototyping | Very fast in QML | Fast for classic UIs with Designer |
Both stacks support native look-and-feel (via Quick Controls styles vs native Widgets), custom styling, and model/view patterns—just with different idioms (same page).
Decision framework: score your product
Use this scorecard in a 30-minute architecture meeting. Score each row Widgets, Quick, or Tie. Majority wins. A near-tie means “pick a primary stack and isolate the minority UI.”
Product and UX
- Primary input: mouse/keyboard denseness → Widgets; touch/gesture/animation → Quick.
- Visual brand: platform-native tool look → Widgets (or Fusion-style Quick); custom animated brand → Quick.
- Information density: wide tables, trees, property grids, multi-document tools → Widgets.
- Screen class: desktop LOB / IDE-like → Widgets; embedded HMI / kiosk / automotive-style → Quick.
Engineering constraints
- Team skills today: strong C++ / weak QML → Widgets first; designers comfortable with declarative UI → Quick.
- Existing codebase: large Widgets app → stay Widgets (or embed Quick islands carefully); greenfield with motion requirements → Quick.
- Performance profile: huge item views with classic delegates → Widgets often simpler; continuous animation / shader effects → Quick.
- Deployment footprint and GPU: low-end terminals without GPU expectations → lean Widgets; GPU always present → Quick is fine.
Process
- Designer collaboration:
.ui+ Designer → Widgets; Design Studio / QML iteration → Quick. - Test strategy: mature Widgets UI tests in-house → Widgets; visual regression on animated UI → plan Quick tooling.
Write the ten answers down. If Widgets wins 7–10 rows, do not force QML for fashion. If Quick wins 7–10, do not cling to Widgets only because “we always used C++ UI.”
Choose Qt Widgets when…
Choose Qt Widgets when most of these are true:
- You ship a traditional desktop product: menus, toolbars, dockable panels, modal dialogs, printers, system trays.
- Users live in tables and trees all day (ops consoles, CAD-adjacent tools, data browsers).
- The team is C++-first and wants compile-time structure without learning QML immediately.
- You need the mature rich text and document editing classes with minimal ceremony (comparison notes).
- Touch is secondary; keyboard shortcuts and accessibility on desktop are primary.
Typical good fits: internal admin tools, measurement/analysis desktops, developer tools, form-heavy LOB apps.
Starter shape (conceptual): QApplication + QMainWindow + layouts + model/view. Keep build hygiene on CMake—see Qt 6 build system — CMake & qmake.
Choose Qt Quick / QML when…
Choose Qt Quick / QML when most of these are true:
- The UI must feel fluid: transitions, physics-like motion, custom chrome, or continuous visual feedback.
- Targets include touch panels, embedded devices, or multi-form-factor products where mouse-first Widgets fight the UX.
- Designers iterate on layout and style weekly; QML’s declarative files are the contract.
- You want full-scene GPU rendering and shader-based effects as a normal part of the product (User Interfaces).
- You are willing to keep logic in C++ and treat QML primarily as the view layer (recommended for serious apps).
Typical good fits: HMI dashboards, branded consumer apps, media/visualization front ends, modern touch desktops.
For desktop-looking Quick apps, pick a Qt Quick Controls style deliberately (for example Fusion for a consistent cross-platform desktop feel, or platform-oriented styles such as FluentWinUI3 where appropriate)—see Styling Qt Quick Controls.
Hybrid apps and QQuickWidget: useful, not free
Yes, you can show QML inside a Widgets UI. Qt documents this path via Qt Quick Widgets / QQuickWidget (User Interfaces note; QQuickWidget).
Use hybrid when:
- You have a large Widgets shell (docks, menus) and need one animated or touch-friendly panel.
- You are migrating screen-by-screen toward Quick without a big-bang rewrite.
Respect the documented costs (QQuickWidget — Performance Considerations):
- At least one extra render pass (offscreen buffer, then a textured quad)—more GPU fragment work.
- Threaded render loop is disabled on all platforms when using
QQuickWidget, so some Animator / vsync-driven benefits are unavailable. - Avoid calling
winId()on aQQuickWidget(forces a native window and hurts the point of the class). - One top-level window should stick to one graphics API; mixing e.g. Vulkan-backed Quick with
QOpenGLWidgetin the same window is a known foot-gun.
Rule of thumb: hybrid is a bridge or island, not a long-term excuse to never choose a primary stack. Prefer one owner for navigation, styling, and input conventions.
CMake reminder when you do embed Quick:
find_package(Qt6 REQUIRED COMPONENTS Widgets QuickWidgets)
target_link_libraries(MyApp PRIVATE Qt6::Widgets Qt6::QuickWidgets)
(As documented on the QQuickWidget page.)
Team skills, tooling, and CMake
Skills map
| Role | Widgets-heavy path | Quick-heavy path |
|---|---|---|
| C++ engineers | Own UI + logic | Own models, services, QML-facing types |
| UI designers | Limited (Designer / style sheets) | Central (QML, Design Studio, Controls styles) |
| QA | Classic widget automation | Add scene/visual checks for animation |
Tooling
- Qt Designer +
.uifiles accelerate Widgets layouts. - Qt Design Studio and QML tooling accelerate Quick.
- Qt Creator hosts both workflows; the choice is the UI stack, not the IDE.
Build system
Whichever UI you pick, treat CMake as the default application build for new Qt 6 work, and keep module boundaries clear (Widgets vs Quick / QuickControls / QuickWidgets). Deep dive: Qt 6 build system — CMake & qmake. Orient modules with the free class hierarchy overview.
Printable decision checklist
Copy into your architecture ticket:
- Primary platform class documented (desktop LOB / embedded HMI / hybrid).
- Input model chosen (mouse-keyboard vs touch-first).
- Scorecard completed (10 rows) with named decision owner.
- Primary UI stack declared: Widgets or Qt Quick.
- Hybrid policy written: none / islands only / migration bridge with end date.
- If hybrid:
QQuickWidgetperformance and graphics-API constraints acknowledged. - Controls/style strategy named (native Widgets look, or Quick Controls style).
- C++ ownership of business logic confirmed (especially for QML UIs).
- CMake modules listed (
Widgets,Quick,QuickControls2/ Controls,QuickWidgetsas needed). - Spike: one vertical slice implemented in the chosen stack before locking the roadmap.
FAQ
Is QML replacing Qt Widgets in Qt 6?
No. Qt 6 continues to document both as main UI technologies, with different strengths. Widgets remain the practical choice for many complex desktop applications; Quick remains the practical choice for fluid and touch-centric UIs (User Interfaces).
Can I use C++ with QML, or is everything JavaScript?
You should use C++ for real application logic. QML describes structure and bindings; JavaScript is optional for light UI logic. Serious apps expose C++ types and models to QML rather than rewriting business rules in script.
Should a migrated Qt 5 Widgets app rewrite to QML?
Usually no, not as a migration requirement. Port Widgets to Qt 6 first (migration checklist). Rewrite to QML only if product UX demands fluid/touch UI that Widgets cannot deliver economically.
When is QQuickWidget the wrong tool?
When the whole window is effectively a Quick app—prefer QQmlApplicationEngine / QQuickView paths instead of paying QQuickWidget’s extra pass and disabled threaded render loop (QQuickWidget docs). Also avoid it when you need stacking tricks with widgets underneath the Quick view; the docs describe hard limitations there.
Do Qt Quick desktop apps look “non-native”?
They can look native-ish or fully custom depending on Qt Quick Controls style and your assets. Styles such as Fusion give a consistent desktop appearance; other styles target platform aesthetics. You choose the trade-off deliberately (Styling Qt Quick Controls).
Which should beginners learn first?
If your first job target is desktop tools, learn Widgets + signals/slots + model/view, then sample QML. If your target is HMI / embedded / animated UI, learn QML + a thin C++ backend early. Either path still needs solid Qt Core skills—start with free Chapter 1 and the examples ZIP.
Next free steps
- Run the scorecard on your real product (not a toy).
- Build a one-screen spike in the winning stack using the free examples.
- Align modules with the class hierarchy overview / Chapter 1 (EN).
- Keep CMake clean via Qt 6 build system — CMake & qmake.
- If you are still on Qt 5 APIs, finish the Qt 5 to Qt 6 Migration Checklist before expanding UI scope.
- Optional DE: Erstes Programm & Qt-Module.
When you want a structured, book-length path through modern Qt 6.9 (Widgets, Quick, build system, and more), Max Schlee’s Qt 6.9 book is available from the same site—the free chapter and examples above are intentionally enough to make the Widgets-vs-QML call without a purchase.
