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:

ModuleEnablesWithout 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

  • toggle is a QCheckBox, 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 QScrollArea with its own recycling rather than QListView, so very large lists behave differently than a model/view Qt app would.
  • Qt 6.8+ for forced light/dark. DAY_THEME uses QStyleHints::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::TextSpellCheck reports 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 on windows-qt.

What each piece becomes

Day pieceQt class
column / row / stack / sectionQWidget (Day owns layout)
labelQLabel
buttonQPushButton
toggleQCheckBox — see the caveat above
sliderQSlider
text_fieldQLineEdit
text_areaQPlainTextEdit
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)
dividerQFrame (HLine)
scrollQScrollArea
listQScrollArea with Day-side recycling
nav (split)QSplitter; the stack header adds a QToolButton
nav_menuQListWidget
tabsQTabWidget
imageQLabel subclass painting a scaled pixmap
canvasQWidget subclass painting with QPainter
dialogs / alertsQMessageBox
promptsQInputDialog
file dialogsQFileDialog
menu bar / context menusQMenuBar / 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().