I want to start building desktop applications for Linux and compare the experience with Windows. For work, I help maintain WinForms applications written in VB and C#, and I also have experience with Java, Python, and C++. I'm especially interested in using C++ for more practice, although I'm open to other languages.
The main options I've come across are Qt and GTK. I use Arch on my desktop and Fedora on my laptop, both with KDE, though I'm not sure how much the desktop environment should influence the choice. Ideally, I'd like to build applications that look and work well across different Linux desktop environments, or perhaps even support Windows and macOS too. Which toolkit would be the better starting point, and should I consider alternatives such as Avalonia?
5 Answers
GTK is primarily a C toolkit, while Qt is primarily designed for C++. Both can be used from other languages, but the difference is noticeable. GTK applications can work across desktop environments, although their appearance and theming may vary. Qt is generally the safer choice for a polished cross-platform application, particularly if Windows and macOS support matter.
For a cross-desktop GTK application, be cautious about depending heavily on GTK 4 or libadwaita if you want it to blend into non-GNOME environments. Those technologies can impose a strong visual style and may not theme consistently elsewhere. In practice, making a Qt application look reasonable on a GTK-based desktop is often easier than making a GNOME-oriented GTK application fit perfectly into other environments.
Qt would be my recommendation for this use case. It’s a large framework, but you don’t need to adopt every part of it, and it works well alongside the standard library. You can use Qt’s strings and containers where they help while still using STL types elsewhere. Qt Quick is worth learning if you want a modern interface rather than a traditional form-based layout.
If your WinForms and C# experience is the part you want to build on, Avalonia is worth evaluating. It provides a cross-platform desktop UI framework with a fairly familiar .NET style and targets Linux, Windows, and macOS. If your main goal is learning C++, though, Qt remains the more direct option.
Qt is probably the strongest fit, especially since you want to use C++. It’s designed around C++ and has good cross-platform support, so the same application can target Linux, Windows, and macOS. KDE is also built around Qt, which may make the ecosystem feel more familiar. For the UI, look at both traditional Qt Widgets and the newer Qt Quick/QML approach. Widgets are straightforward for classic desktop interfaces, while QML is more modern and flexible, though it has a learning curve.

That distinction between Widgets and Qt Quick is helpful. I’m used to traditional forms, but I’ll take a look at QML before deciding.