Linux (Qt 6)
linux-qt renders Qt 6 Widgets through a small compiled C++ shim. It’s the toolkit beneath KDE
Plasma, its QAccessible layer bridges to the native accessibility API on every OS (no other Day
backend does that today), and it is portable enough to also be a development target on macOS and
Windows.
Getting started
Qt 6 development packages and pkg-config are the requirement; the shim is built by build.rs,
and no moc step is involved.
sudo apt install qt6-base-dev pkg-config # Debian/Ubuntu
sudo dnf install qt6-qtbase-devel pkgconf # Fedora
brew install qt pkg-config # macOS, for the macos-qt dev combo
cargo install day-cli
day new app my-app --toolkit linux-qt
cd my-app
day launch -p linux-qt
Two optional modules enable two pieces. Both degrade gracefully rather than failing the build:
| Module | Enables | Without it |
|---|---|---|
qt6-webengine-dev (Qt6WebEngineWidgets) | webview() | a URL label; navigation calls become no-ops |
qt6-multimedia-dev (Qt6MultimediaWidgets) | media() | a URL label; play/pause become no-ops |
day doctor --toolkit qt reports the whole set.
day pack -p linux-qt # single-file .flatpak (org.kde.Platform runtime)
If your binary links QtWebEngine, day pack adds the Qt WebEngine BaseApp — about 87 MB of
Chromium — because no runtime ships it. Apps that don’t link it stay small; that check is on the
actual binary, not on a flag.
Caveats and special considerations
toggleis aQCheckBox, not a switch. Qt Widgets has no native switch control. This is the one place where the same Day code produces a visibly different control shape than on the other desktops.- The list is emulated. Day drives a
QScrollAreawith its own recycling rather thanQListView, so very large lists behave differently than a model/view Qt app would. - Qt 6.8+ for forced light/dark.
DAY_THEMEusesQStyleHints::setColorScheme; on older Qt (Ubuntu 24.04 ships 6.4) Day falls back to the Fusion style with a hand-built dark palette. - No spell-check, because Qt ships none —
Cap::TextSpellCheckreports unsupported and the patch is a no-op. - No Lottie, no map on this backend — each renders its placeholder.
cover()presents as a topmost window-sized child (no transition, programmatic dismissal only). - Qt on macOS and Windows (
macos-qt,windows-qt) is a development combo: no packaging. Windows uses the MSYS2/MinGW toolchain and is marked experimental in CI. MSYS2 has no Qt6 WebEngine, so the web view degrades there — and the MinGW linker currently drops external piece renderer registrations, so those pieces draw placeholders onwindows-qt.
What each piece becomes
| Day piece | Qt class |
|---|---|
column / row / stack / section | QWidget (Day owns layout) |
label | QLabel |
button | QPushButton |
toggle | QCheckBox — see the caveat above |
slider | QSlider |
text_field | QLineEdit |
text_area | QPlainTextEdit |
picker().menu() | QComboBox |
picker().segmented() | checkable QPushButtons in an exclusive group |
picker().inline() | QRadioButtons in an exclusive group |
progress(f) | QProgressBar |
spinner() | QProgressBar in busy mode (Qt has no spinner widget) |
divider | QFrame (HLine) |
scroll | QScrollArea |
list | QScrollArea with Day-side recycling |
nav (split) | QSplitter; the stack header adds a QToolButton |
nav_menu | QListWidget |
tabs | QTabWidget |
image | QLabel subclass painting a scaled pixmap |
canvas | QWidget subclass painting with QPainter |
| dialogs / alerts | QMessageBox |
| prompts | QInputDialog |
| file dialogs | QFileDialog |
| menu bar / context menus | QMenuBar / QMenu |
external activity() | QProgressBar (busy) |
external combobox() | editable QComboBox |
external search_field() | QLineEdit with a clear button and a find icon |
external date_picker() | QDateEdit with a calendar popup, or QCalendarWidget inline |
external time_picker() | QTimeEdit |
external webview() | QWebEngineView |
external media() | QMediaPlayer + QVideoWidget |
Text measurement asks QLabel for its natural width with wrapping temporarily off, then
heightForWidth at the granted width; the text area uses QTextDocument. Everything else uses
sizeHint().



