Note: In this answer, "Qt Widgets" refers to a Qt Widgets Application, selectable when creating a new Qt application.
This is seven years after the question was first posted... but here's my "objective" two cents to neutralise any developments since then.
A Refresher
Language
Qt Quick projects use QML and JavaScript. The latter carries the brunt of program logic: event actions (Component.onCompleted
, onClicked
, etc.), math, etc.
Qt Widgets projects use C++ code. (PyQt and PySide, Python bindings for Qt, uses Python.)
Performance and Coding
As such, Qt Widgets could be considered low-level compared to Qt Quick. But this implies that in the long run, a Qt Widgets project will run faster and have better performance. Being low-level can be good though, as Qt Widgets is more exposed to native API (the QtCore module, etc). That said, it is often used for desktop development.
Qt Quick caters to both desktop and mobile development. It has ready-to-use popups, animations, tabs and layouts, flickables, drawers, and the usual controls; all ubiquitous in mobile development.
Look-and-Feel
As mentioned before, Qt Widgets is more in touch with the native look-and-feel, so styling defaults to the native look-and-feel. You can use Qt Style Sheets to enhance your widgets, but these are still limited.
Qt Quick is more flexible in terms of styling. One interesting case study is MuseScore. In the migration from version 3 to 4, MuseScore changed many UI components from Qt Widgets to Qt Quick/QML. Why? Because of ambitious UI/UX designs. Pop-ups (among other things) were more convenient to implement with Qt Quick. (Source: Tantacrul on MuseScore 4, 8:08-9:30)
UI Design
Both have ui
files which work with QtDesigner, providing a high-level view for setting layouts and creating interfaces. This also enables designers with little knowledge of programming to do their magic. (In Qt Quick, extensions are .ui.qml
. In Qt Widgets, they are .ui
.) It's not necessary to use .ui
files; you can still choose to programmatically design your UI using QML/JS or C++/Python.
Learning
If you're completely new to programming, I suggest having a look at Qt Quick first. Personally, I think Qt Quick has a gentler learning curve and is easier to work with to accomplish myriads of projects. It's called "Qt Quick" for a reason. (Don't look down on Qt Widgets though, they have some nice modules that outdo QtQuick.)
However, if you've been programming with C++ or Python before, I would suggest taking a look at Qt Widgets first, to get used to their signals and slot mechanism and modules that might interest you (e.g. sql
, network
, gui
) alongside programming designs (e.g. model/view programming for displaying data).
Especially with C++, most non-Qt libraries that do event-handling use while
-loops, this is not the case with Qt. They use signals and slots.
In the end, even if you're mainly using Qt Widgets, you might want to look at Qt Quick as it offers a high-level declarative language to work with and allows you to set things up more quickly. (Especially for mobile development.)
Qt provides examples in abundance for both Qt Quick and Qt Widget projects, along with a forum. You shouldn't worry about getting help in the long run. (Don't forget StackOverflow!)
Qt Quick + Qt Widget
So far we've been treating them like separate entities. But it is possible to integrate QML into C++. This allows you to take advantage of Qt Widget, C++, and other modules. For example, QtQuick provides a TreeView
but not a TreeModel
, which can/should be registered into QML from C++. Often there is a separation of concerns pitch, where Qt recommends separating programs into UI and logic into QML and C++ respectively.
This also comes in handy, if say, you need a backend for intense SQL queries, algorithms, or asynchronous http/xml requests. Isn't that cool? QML/JS frontend plus a C++ backend. Fullstack Qt'er. :-)