With Lazarus, you never deal with backend widgetset directly, what you code and has to know most of the time is only LCL interface. This means you can switch widgetset and recompile project seamlessly to create several look and feel for your app, without any code change or conditional compilation. In certain cases, widgetset specific call can be done though.
With QML, your code is strictly limited to Qt.