What are the best GUI toolkits that can be used to make a VTK based app ?

Hi everyone,

So, The app in question will be used to visualize some complex 3D models for scientific purposes.
I’m aware that QT has an good integration possibility but the licensing scheme makes it very hard for us to use it since +5 companies are involved in the project.

The GUI toolkit should be either open source or should have a straightforward and reasonable pricing scheme.

Thanks in advance

Qt’s free LGPL license is suitable for most commercial projects. Is there anything specific that you think would prevent you from using this license?

That said, The Qt Company is not behaving nicely, they excluded non-paying users from LTS releases, they are harrassing developers to pay for the unreasonably expensive commercial license, and they barely do any improvements in classic widgets. So, I would be interested in hearing about experiences with other GUI toolkits.

Don’t forget to look at Java and Python as well.

From my understanding, LGPL cannot be distributed as a closed source software.
It is not good at all for commercial software…

LGPL basically just means that you need to ship the Qt part as shared libraries so that anyone could swap in their own recompiled/modified versions of those libs. And that if you provide modified versions of Qt you need to release the source code of those modifications. Neither of those is a show stopper for commercial software in my experience.

If you are making a serious commercial product you should get legal help to evaluate these licenses and see if using Qt under LGPL is really a problem for your product plans. Or you should assess the cost of getting a Qt commercial license. Buying a license may not make sense for research but could be a reasonable business decision.

Back to the technical question of what user interface toolkit to use with VTK, you should also consider the using HTML/javascript/typescript/electron technologies. Many mainstream applications like vscode and teams are written that way these days and they avoid all these 80’s-90’s era software licensing models.

Thank you for the insight. I’m sorry but I had GPL in mind when I wrote that. I keep getting confused between the two.
Many of the components that we need are under the GPL license. As for your suggestion to use electron. I believe that this means that we should use VTKjs, which might not be performant enough for are use cases. We are active in both research and industry and therefore we prefer a software with a less complicated or more affordable pricing scheme.
300$ per month per dev is waay too expensive for a small company like ours.

trame, which builds on vtk.js, includes both client and server-side rendering. Apps are written in python; for the most part you don’t need to learn JavaScript and the pipelines you build in python all do the heavy lifting in compiled C++ code via VTK’s wrappers. What are you worried will be slow?

The UI uses vue.js widgets in html, which are really nice.

Thank you for the reply.
correct me if I’m wrong but using web technologies means using VTK.JS which is using webgl for rendering. Webgl is a wrapper for opengl and therefore it under performs when it comes to dense datasets.
VTKjs did not yet reach functionalities parity with VTK yet.

I can program in all javascript, python and c++ (These actually are the only three languages I use on almost daily basis so this is not a problem). VTK will be used for multi-layered very dense 3D models and every bit of performance will be apprciated

Two things:

  1. The overhead is not generally significant for large datasets because large arrays require a single call; the cost of the indirection is amortized over a lot of array values.
  2. With trame, you can use remote (server-side) rendering which is all C++; the resulting rendered image is transferred to the client (which in the case of a desktop app is really just a memory reference). Transferring images at interactive rates – even across the internet – is generally not a problem these days as there are multiple capabilities to deal with it (image compression, image scaling). The only caveat is for situations requiring extremely low latency like videogames or real-time simulations.

Can trame pass the data by pointer/reference (without copying or network transfer) in case of client-side rendering, if the client and server are on the same computer? If not, is there any chance that it could be implemented in the future (is there any mechanism that allows data sharing between the native rendering server and a web client on the same computer)?

I don’t believe this is prohibited but am not sure it is currently done. @Sebastien_Jourdain ?

trame can rely on server-side rendering which means all the code execute within VTK/C++ layer and only serve an image stream to the web front-end.

Trame aims to let your write your application in plain Python quickly and effortlessly.

Also once a trame application is available, the resulting can be served as a service in the cloud or as a desktop application using either pywebview (default) or tauri. Trame/tauri documentation is coming.

1 Like

For local rendering, unfortunately you have to copy the surface mesh around (or image data for volume rendering) due to security constraint of browser.

With tauri, it might be possible (with some new capabilities coming) to have a shared GL context where the VTK/C++ could actually feed the GL context directly that get natively displayed into the web view.

3 Likes

The vtk specific examples in trame can be used as reference with various local/remote/client rendering.

2 Likes