This repository contains a Qt Quick + C++ demo app that is built and run inside:
dalogik/qt-docker:qt6.11.0-linux64-gcc
The app uses a fake/simulated C++ backend engine for demo behavior (not a real production backend).
CMakeLists.txt- Qt 6.11 CMake projectsrc/main.cpp- C++ app bootstrapsrc/Engine.h/.cpp- fake C++ backend engine exposed to QMLqml/Main.qml- demo UIdocker-compose.yml- dev container servicescripts/container-build-run.sh- one-command build and run helper
Engineis injected into QML as initial propertybackendinsrc/main.cpp.- QML reads
Q_PROPERTYvalues such as workload, users, alerts, and models. - QML calls C++
Q_INVOKABLEmethods such aspostEvent(...),applyConfig(...),runJob(...),resetSystem(),weeklyStats(), andsetLanguage(...).
flowchart LR
QML[QML GUI]
Engine[C++ Engine]
Models[Qt Models]
Translator[Translator and QML engine]
QML -->|invokable calls| Engine
QML -->|property reads| Engine
Engine -->|change signals| QML
Engine -->|model objects| Models
Models -->|role data| QML
QML -->|request language change| Engine
Engine -->|language change signal| Translator
Translator -->|retranslate ui| QML
sequenceDiagram
participant User as User
participant QML as QML ControlsPage
participant Engine as C++ Engine
participant Models as Qt Models
participant UI as QML Dashboard/Windows
User->>QML: Click Deploy
QML->>Engine: postEvent("Info", "Deployment started")
Engine->>Models: append notification / update state
Engine-->>UI: Emit change signals
UI->>Engine: Read updated Q_PROPERTY values
Engine-->>UI: Return new workload/users/alerts/models
UI-->>User: Refresh visible widgets and lists
- Docker installed and running
- Docker Compose v2 plugin (
docker compose) - X11 on Linux for GUI forwarding
If you are on Ubuntu 24.04, run the following commands to install Docker Engine and Docker Compose plugin.
- Remove old/conflicting Docker packages (safe if not installed):
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove -y "$pkg"
done- Set up Docker's apt repository:
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update- Install Docker Engine + Compose plugin:
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin- Enable and start Docker:
sudo systemctl enable --now docker- Allow your user to run Docker without
sudo:
sudo usermod -aG docker "$USER"
newgrp docker- Verify installation:
docker --version
docker compose version
docker run --rm hello-worldchmod +x scripts/container-build-run.sh
./scripts/container-build-run.shchmod +x scripts/enter-container.sh
./scripts/enter-container.shUse these scripts for a faster reuse workflow:
- Start container once
chmod +x scripts/container-start.sh
./scripts/container-start.sh- Enter shell anytime
chmod +x scripts/container-enter.sh
./scripts/container-enter.sh- Run existing app binary without rebuilding
chmod +x scripts/container-run-only.sh
./scripts/container-run-only.shOptional software fallback:
USE_SOFTWARE_RENDERING=1 ./scripts/container-run-only.shAfter entering the container shell, use:
cd /workspace
./scripts/in-container/configure-build.sh
./scripts/in-container/run-app.shOptional software fallback inside container:
USE_SOFTWARE_RENDERING=1 ./scripts/in-container/run-app.shClean build output inside container:
./scripts/in-container/clean-build.shThis script will:
- Allow Docker access to your local X server
- Start the
qt-devcontainer - Configure and build with CMake + Ninja inside the container
- Launch the app from inside the container
- Revoke X server access when you exit
The container is configured for GPU rendering by default via /dev/dri passthrough.
If your host GPU stack is unstable, run with software fallback:
USE_SOFTWARE_RENDERING=1 ./scripts/container-build-run.shIn software fallback mode, the app is forced to llvmpipe.
The WrapVulkanHeaders message during CMake configure is non-fatal for this demo.
xhost +si:localuser:root
docker compose up -d qt-dev
docker compose exec qt-dev bash -lc 'cmake -S /workspace -B /workspace/build -G Ninja'
docker compose exec qt-dev bash -lc 'cmake --build /workspace/build -j"$(nproc)"'
docker compose exec qt-dev bash -lc '/workspace/build/appqtdemo'
xhost -si:localuser:rootdocker compose down