The choice of the UI library depends a lot on the type of app you're developing.
For many types of apps, a single page HTML/JS/CSS app bundled as an executable is the best choice.
If your app will do a lot with the hardware (sound, video, networking,...), then you should look at native libraries for cross-platform hardware access and UI (though HTML/JS/CSS based UIs with native core are also possible).
In my experience, making a good "cross-platform" UI can be tricky, especially if your platforms include both desktop and mobile.
The reason is that each platform has it's own set of features, limitations and design requirements, which you either have to emulate, ignore or implement as platform-specific modules.
Most UI libraries implement their own windowing systems which makes it possible to have an app that behaves similarly on all platforms.
The drawback is that the app looks and feels 'cooked' - things aren't quite standard, animations are a bit off, fonts are rendered differently, etc.
One such example is Qt, which has been mentioned many times here. It is probably the best choice if pixel perfection and native look/feel isn't your primary requirement. With a bit of work you could probably achieve native 'perfection' with it too.
If you work with sound, then you should take a good look at JUCE - it has a very pleasant API, has a low overhead and a very friendly community.
That being said, the best choice IMHO is to develop native UIs for each platform or at least for the mobile versions of your app.
The trick is to separate your design into "core" and "ui" parts.
The core is a cross platform C++ library, which implements all the business logic and low level hardware access, exposing an API to the UI layer.
The UI is then implemented in Qt/JUCE for the desktop apps, Objective-C++ and Swift for iOS (and OSX if you want) and Java+JNI on Android.
The advantage of this method is that it forces you to have clear separation of concerns between the core business and UI layers and you can have different people working on the core and the specific platform UIs.
The ultimate advantage is of course your user's experience - native apps are more gratifying.
It might sound like a lot more work, but it's usually not as bad as it sounds - if you have a well designed core API, the UI is just a visual representation of your application state, which is not that difficult to implement on each platform.
In the end, personal preference and tastes also matter - use whatever makes you (and your team) feel more comfortable.
Good luck !
If your app will do a lot with the hardware (sound, video, networking,...), then you should look at native libraries for cross-platform hardware access and UI (though HTML/JS/CSS based UIs with native core are also possible).
In my experience, making a good "cross-platform" UI can be tricky, especially if your platforms include both desktop and mobile.
The reason is that each platform has it's own set of features, limitations and design requirements, which you either have to emulate, ignore or implement as platform-specific modules.
Most UI libraries implement their own windowing systems which makes it possible to have an app that behaves similarly on all platforms.
The drawback is that the app looks and feels 'cooked' - things aren't quite standard, animations are a bit off, fonts are rendered differently, etc.
One such example is Qt, which has been mentioned many times here. It is probably the best choice if pixel perfection and native look/feel isn't your primary requirement. With a bit of work you could probably achieve native 'perfection' with it too.
If you work with sound, then you should take a good look at JUCE - it has a very pleasant API, has a low overhead and a very friendly community.
That being said, the best choice IMHO is to develop native UIs for each platform or at least for the mobile versions of your app.
The trick is to separate your design into "core" and "ui" parts. The core is a cross platform C++ library, which implements all the business logic and low level hardware access, exposing an API to the UI layer.
The UI is then implemented in Qt/JUCE for the desktop apps, Objective-C++ and Swift for iOS (and OSX if you want) and Java+JNI on Android.
The advantage of this method is that it forces you to have clear separation of concerns between the core business and UI layers and you can have different people working on the core and the specific platform UIs.
The ultimate advantage is of course your user's experience - native apps are more gratifying.
It might sound like a lot more work, but it's usually not as bad as it sounds - if you have a well designed core API, the UI is just a visual representation of your application state, which is not that difficult to implement on each platform.
In the end, personal preference and tastes also matter - use whatever makes you (and your team) feel more comfortable. Good luck !