I've seen that it is possible to create executables that can be run from within a web browser. This is very interesting for my pet project Traffic Control and I'll spend some time exploring this.
What is web assembly and why bother?
Desktop applications are a bit inconvenient for the end user. He/she needs to find an installation package that goes with the particular operating system - that requires some competence and also some administrator rights. Further, there is a risk of viruses. After using the software, the software lies on the computer until removed. It will take quite a bit of persuation to make people install my software.
With a Web Assembly app, it is different. The program will be linked from a simple web page that loads the executable to a sandboxed environment inside the web browser the user is using. This will be independent on the hardware architecture and operating system. No installation and no cleanup.
Qt supports web assembly - this is the key point of Qt: that it is a programming framework that can be used for different platforms. If I'm able to port TrafficControl to web assembly and deploy on a web server, the program will be able to run from any connected device with one of the bigger web browsers.
What would that mean for me?
For me, the program would be deployable to any unit that runs one of the major web browsers. To deploy the software, I would need to set up a web server, or use an existing platform that hosts the binary.
Traffic Control would need some refactoring:
- The program depends on python for converting files. That needs to be in C++
- I need to consider how to access local files and examples
- I need to look into the user interface - should I migrate to QML for all user interface?
Step-by-step
- Install an updated Python version and Emscripten
- Setup environment for Qt Web Assembly
- Specify C and C++ compiler
- Other settings?
- Configure for simple C++/QML application - QML Demo
- Download from GitHub
- Compile for desktop
- Compile for Qt Web Assembly
- Open in Web Assembly
- Adopt TrafficControl to WebAssembly
- Find out how to store the TNF/TNM/TNO files when using webAssembly? Initially, use read-only and disable the conversion features?
- Handle loading of traffic network files
- Port the conversion from KML to Traffic Map File/Traffic Network file to either
- Python in-project code, or
- C++ Code
- Deploy application on web server
Emscripten is used for compiling to webAssembly and it is based on Python and needs a late Python version. Installing Python is straight forward.
I installed Emscripten from the git repo:
|
Yes, I'm using a screen shot. If you're copying commands, you'd better copy from the formal documentation. |
As I'm using Qt 5.15.2, I need to install the
corresponding Emscripten version (1.39.8) and activate it permanently (use the same version for each instance:
However, after activating emsdk, the python path is missing. I found out that I need to run the shell as an administrator.
In Qt, I currently use the auto-detected "Local PC" as a target for the binaries. I added a web assembly device where I pointed to the Emscripten folder.
Once the device is configured, I need to set up a kit for the compilation.
Finally, I specified that the project should have the web assembly option in the "Projects" tab.
This time, I used an old
QML demo project that I have on my Github account. In that project, I explored some basic QML features and how to interact from C++.
During the build process, I saw a warning - my installation of Qt was actually built with Emscripten 1.39.7, not 1.39.8 as the documentation said. The build was still successful.
After the build was completed, I started it by loading the local web site:
There it is! A C++/QML application that is running inside a web browser. The html page can be embedded into another web page on a web server. For my simple QML application, the binary used ~20 MB for the release build and ~27 MB for the debug build.
In the next blog post, I'll explore if it is possible to port TrafficControl to web assembly. For Qt 5.15.2, Qt Location seems not to be supported for web assembly. For Qt6, QtLocation and QtPositioning didn't work out of the box, maybe it is possible to find a workaround.