Pick up any C++ desktop application and odds are its UI was built with one of three frameworks. Qt powers KDE Plasma, VLC, and countless embedded dashboards; wxWidgets sits underneath Audacity and KiCad with controls that look exactly like the operating system’s own; FLTK has been quietly shipping tiny, fast utilities since 1998. Yet choosing between them in 2026 is harder than ever, because the real differences are not feature checklists — they are licensing obligations, native look versus drawn widgets, and how much of your binary you are willing to spend on chrome.
Get it wrong and you discover the hard way that Qt’s LGPL does not allow static linking into a closed-source app without a commercial license, or that wxWidgets apps look different on every platform and you only tested one, or that FLTK’s minimalist widget set means hand-rolling the rich control you assumed existed. This guide compares the three frameworks head-to-head with real code from their official repositories, so the decision is based on facts, not folklore.
TL;DR: Quick Verdict
If you need maximum capability — charts, multimedia, embedded Linux, a declarative UI language, first-party tooling — use Qt (the GitHub mirror of qt/qtbase shows 3,072 stars, but it is the de-facto industry standard with LTS releases and commercial support). If you want true native widgets on Windows, macOS, and Linux with a license that explicitly permits static linking into closed-source apps, use wxWidgets (7,266 stars). If your app is a small utility, internal tool, or kiosk UI where binary size and memory matter more than widget richness, use FLTK (2,309 stars). The licensing table below decides more projects than the feature table does.
Qt vs wxWidgets vs FLTK: Feature Comparison
| Feature | Qt (qtbase) | wxWidgets | FLTK |
|---|---|---|---|
| GitHub repo | qt/qtbase (mirror of code.qt.io) | wxWidgets/wxWidgets | fltk/fltk |
| GitHub stars | 3,072 (mirror; full history on code.qt.io) | 7,266 | 2,309 |
| License | LGPL-3.0 / GPL-3.0 / commercial | wxWindows Licence (LGPL derivative with static-linking exception) | LGPL-2.0 with exceptions (static linking allowed) |
| Last push (2026) | Sep 5 | Sep 5 | Sep 5 |
| Widget rendering | Drawn by Qt (consistent look) | Native OS controls (platform look) | Drawn by FLTK (consistent, minimal) |
| Platforms | Windows, macOS, Linux, embedded Linux, mobile | Windows 7-11 (incl. ARM64), Unix/GTK, macOS Cocoa | Linux (X11/Wayland), Windows, macOS |
| Declarative UI | Yes (Qt Quick/QML) | No | No |
| UI designer | Qt Design Studio / Qt Creator | wxFormBuilder (community) | FLUID (built-in) |
| Widget library depth | Very large + add-on modules | Large (native controls + extras) | Small-to-medium, intentionally minimal |
| OpenGL/3D support | Qt OpenGL / Qt Quick 3D | wxGLCanvas | Built-in OpenGL + GLUT emulation |
| C++ standard floor | C++17 (Qt 6) | C++11 (3.2 branch) | C++11 (1.5+) |
| Static linking (closed-source) | Requires commercial license | Allowed | Allowed |
| Typical binary size | Large | Medium | Small |
| Best known for | Full-stack app framework + embedded | Native look and feel | Minimal footprint, fast builds |
Decision Matrix: Which Framework Fits Your Project?
| Use Case | Recommended Framework | Why |
|---|---|---|
| Commercial desktop app distributed statically linked, no license fees | wxWidgets or FLTK | Both have licensing exceptions that permit static linking without buying anything |
| Embedded Linux UI on ARM boards (dashboards, medical, automotive) | Qt | Qt Quick on top of the Linux framebuffer/Wayland is the established embedded stack; commercial licensing available when LGPL is a problem |
| Internal tool that must look and feel native on Windows and macOS | wxWidgets | Native controls mean your app behaves like a citizen of each OS (menus, dialogs, accessibility) |
| Tiny utility where you care about binary size and startup time | FLTK | Minimal dependencies and drawn widgets keep binaries small and builds fast |
| Rich data-heavy desktop app (tables, docking, charts, MDI) | Qt | Qt Widgets + ecosystem modules cover the hard 20% you will otherwise hand-build |
| Modern touch-friendly or animated UI | Qt Quick/QML | Declarative scene graph with hardware acceleration; the other two are imperative widget APIs |
| Team already knows C++11/98 legacy codebase | wxWidgets 3.2 branch | Only current framework still offering a C++98-compatible branch |
Qt: The Industry-Standard Framework (and Its Licensing Catch)
Qt is not just a widget toolkit: it is an application framework with networking, SQL, multimedia, a declarative UI language (Qt Quick/QML), first-class tooling, and LTS release cadence. Development happens on code.qt.io with the GitHub repository at qt/qtbase acting as a mirror — so the 3,072-star count understates its true reach. Qt 6 requires C++17 and builds around CMake.
The canonical first-widgets example from the official tutorial (examples/widgets/tutorials/widgets/toplevel/main.cpp, BSD-3-Clause) shows how little code a running window needs:
| |
The companion CMakeLists.txt from the same example is the standard Qt 6 shape you will see in every modern Qt project:
| |
The catch is licensing. Qt is available under LGPL-3.0, GPL-3.0, or a commercial license. LGPL-3.0 is fine for open-source apps and for closed-source apps that link dynamically, but static linking into a closed-source application requires the commercial license — a fact many teams discover only at release time. Qt also carries real weight: the framework pulls in substantial runtime libraries, so binaries and memory footprints are the largest of the three.
wxWidgets: Native Controls Without the Licensing Drama
wxWidgets describes itself as “a free and open source cross-platform C++ framework for writing advanced GUI applications using native controls.” That last phrase is the whole philosophy: on Windows your buttons are real Win32 buttons, on macOS real Cocoa controls, on Linux real GTK widgets. The current line supports Windows 7-11 (32/64-bit Intel and ARM64), most Unix variants via GTK+, and macOS 10.10+ via Cocoa, with compilers from MSVC 2015 up to 2026, g++ up to 15, and Clang up to 19. The stable release branch is 3.2 (which still supports C++98 for legacy projects), with active development on master.
The minimal sample from the official repository (samples/minimal/minimal.cpp) shows the application model — an wxApp subclass whose OnInit builds the UI:
| |
Frames subclass wxFrame and use event tables or bindings to route menu and control events:
| |
The licensing story is the friendliest of the three: the wxWindows Licence is a modified LGPL that explicitly allows not distributing your application sources even when you statically link — no commercial license, no dynamic-linking contortions. The trade-off: because widgets are native, your app’s appearance is whatever each OS provides, so you must test on all target platforms, and some advanced cross-platform widgets (grids, rich text) are wrappers that inherit platform quirks. The repository ships more than a hundred examples and builds with CMake or the classic per-port build scripts (docs/<port> covers wxGTK, wxMSW, wxOSX).
FLTK: Small Binaries, Fast Builds, Zero Bloat
The Fast Light Tool Kit was created by Bill Spitzak and is maintained by a small international group with a central GitHub repository. FLTK 1.5 (the current development line per the README) targets Linux under X11 or Wayland, Windows, and macOS, supports OpenGL and includes GLUT emulation, and requires only CMake and a C++11 compiler. Its stated goal is “modern GUI functionality without bloat” — the toolkit draws its own widgets, keeps dependencies minimal, and produces small, fast-starting applications.
The canonical hello program from the repository (test/hello.cxx) is about as short as GUI code gets:
| |
FLTK includes FLUID, a built-in visual interface designer that generates the C++ source for your windows — a surprisingly productive workflow for forms and simple tools. Licensing follows the LGPL with exceptions for static linking, and the README is explicit that commercial use is permitted. The honest limitations: the widget set is smaller and intentionally simpler than Qt’s or wxWidgets’ (you will hand-roll fancy controls), and because widgets are drawn by the toolkit rather than by the OS, applications look consistent everywhere but native nowhere.
Pitfalls, Migrations, and Hard-Won Advice
- Read the Qt license before you architect, not before you ship. Static linking Qt LGPL into closed-source software requires a commercial license; dynamic linking is acceptable under LGPL-3.0. If you cannot guarantee dynamic linking on every target platform (some embedded toolchains make it painful), budget for the commercial license or choose wxWidgets/FLTK.
- The
Q_OBJECT/ moc trap. Qt classes using signals and slots need the meta-object compiler. Modern CMake handles moc automatically viaqt_add_executable, but hand-rolled build files that forget AUTOMOC produce baffling link errors. Always use the Qt-provided CMake helpers. - wxWidgets native look means platform testing is mandatory. A wxGTK app styled and tested only on Linux will look unfinished on Windows, and macOS has its own conventions (the About item lives in the application menu;
wxID_ABOUTmatters). Budget CI runners or at least smoke-test VMs for every OS you claim to support. - Do not chase the 3.2 vs master mismatch. wxWidgets master (the next release line) has API changes; pin your builds to the 3.2 branch unless you specifically need new features, and never mix headers from different branches.
- FLTK 1.5 raised the floor. FLTK 1.5 requires CMake and C++11 — the old
configure && makeflow and pre-C++11 compilers are gone. Legacy projects on 1.3/1.4 should plan the CMake migration before upgrading. - Drawn widgets hide platform integration gaps. Both Qt and FLTK draw their own widgets, which gives visual consistency but means you own the integration details: High-DPI scaling, input methods for East Asian text, screen-reader accessibility, and per-OS clipboard/drag-drop behavior all need explicit attention.
- Binary size is a feature. If your tool is distributed to hundreds of machines or embedded in a constrained image, FLTK’s smaller footprint is a legitimate architectural reason to accept fewer widgets. Measure, then decide — do not assume.
- Qt 5 code does not port to Qt 6 by recompiling. Deprecated APIs were removed (e.g.,
QRegExp→QRegularExpression, chart and data-visualization modules moved out of core). Budget migration time if you maintain a Qt 5 codebase.
GUI framework choices parallel what we have covered for other ecosystems: our Rust GUI frameworks comparison weighs immediate-mode against retained-mode toolkits in Rust, and the Electron alternatives article shows how far web-tech desktop shells have come when you prefer shipping HTML/CSS over C++. For the async and event-loop machinery your GUI will sit on top of, our C++ event loop frameworks guide compares libuv, libevent, and Seastar.
FAQ
Can I use Qt in a closed-source commercial application for free? Yes, if you link dynamically under the LGPL-3.0. Static linking into a closed-source application requires a commercial license from The Qt Company. wxWidgets and FLTK both permit static linking in commercial applications at no cost thanks to their licensing exceptions.
Which framework gives the most native-looking application? wxWidgets. It wraps native controls (Win32, Cocoa, GTK), so the application adopts each operating system’s genuine look and behavior. Qt and FLTK draw their own widgets, giving consistent cross-platform appearance that is not native to any platform.
Is FLTK suitable for commercial software? Yes. FLTK is distributed under the LGPL with exceptions, including for static linking, and the project’s official README explicitly states it can be used in commercial software.
What are the main differences between Qt Widgets and Qt Quick? Qt Widgets is the classic imperative C++ widget API, best for traditional desktop applications. Qt Quick/QML is a declarative scene-graph language with hardware-accelerated rendering, better suited to modern, animated, touch-friendly interfaces. Both ship in Qt 6.
Does wxWidgets support high-DPI displays? Yes, wxWidgets 3.x has per-monitor DPI awareness on Windows and Retina support on macOS. Because it uses native controls, scaling behavior generally follows the underlying platform, but you should verify layout behavior at different DPI settings on each OS you target.
Which framework has the smallest binary size? FLTK. Its intentionally minimal widget set and drawn (rather than native) controls keep dependencies and binary sizes low. Qt produces the largest binaries due to its framework scope; wxWidgets sits in between.
💰 想测试你的市场判断力?我用 Polymarket 做预测市场交易——这是全球最大的预测市场平台,从大选结果到技术监管时间线,什么都可以押注。和赌博不同,这是真正的信息市场:你懂的信息越多,胜率越高。我靠预测技术相关事件的走向已经赚了不少。用我的邀请链接注册:Polymarket.com