Initial qt-tests tray app with split amd64/arm64 AppImage CI workflows
All checks were successful
qt-linux-arm64 / qt-linux-arm64 (push) Successful in 47s
qt-linux-amd64 / qt-linux-amd64 (push) Successful in 1m3s

This commit is contained in:
OpenClaw Bot 2026-03-14 16:24:26 +00:00
commit 7b056fb78e
5 changed files with 191 additions and 0 deletions

View File

@ -0,0 +1,66 @@
name: qt-linux-amd64
on:
push:
branches: [ main ]
tags: [ 'v*' ]
pull_request:
branches: [ main ]
workflow_dispatch:
jobs:
qt-linux-amd64:
runs-on: amd64-native
steps:
- uses: actions/checkout@v4
- name: Install build dependencies
run: |
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y \
build-essential cmake ninja-build qt6-base-dev \
imagemagick file curl
- name: Configure + build
run: |
set -eu
cmake -S . -B build-out -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build-out --parallel "$(nproc)"
- name: Build AppImage (amd64)
run: |
set -eu
rm -rf AppDir artifacts
mkdir -p AppDir/usr/bin AppDir/usr/share/applications AppDir/usr/share/icons/hicolor/256x256/apps artifacts
cp build-out/qt_tray_demo AppDir/usr/bin/qt_tray_demo
chmod +x AppDir/usr/bin/qt_tray_demo
convert build/appicon.svg -resize 256x256 AppDir/usr/share/icons/hicolor/256x256/apps/qt_tray_demo.png
cat > AppDir/usr/share/applications/qt_tray_demo.desktop <<'DESKTOP'
[Desktop Entry]
Type=Application
Name=Qt Tray Demo
Exec=qt_tray_demo
Icon=qt_tray_demo
Terminal=false
Categories=Utility;
DESKTOP
curl -L -o linuxdeploy.AppImage https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
curl -L -o linuxdeploy-plugin-qt.AppImage https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage
chmod +x linuxdeploy.AppImage linuxdeploy-plugin-qt.AppImage
export QMAKE=qmake6
APPIMAGE_EXTRACT_AND_RUN=1 ./linuxdeploy.AppImage --appdir AppDir \
-e AppDir/usr/bin/qt_tray_demo \
-d AppDir/usr/share/applications/qt_tray_demo.desktop \
-i AppDir/usr/share/icons/hicolor/256x256/apps/qt_tray_demo.png \
--plugin qt --output appimage
generated=$(ls -1 *.AppImage | head -n 1)
out="artifacts/qt_tray_demo-linux-amd64-run${{ github.run_number }}.AppImage"
mv "$generated" "$out"
chmod +x "$out"
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: qt_tray_demo-linux-amd64-run${{ github.run_number }}
path: artifacts/
retention-days: 14

View File

@ -0,0 +1,66 @@
name: qt-linux-arm64
on:
push:
branches: [ main ]
tags: [ 'v*' ]
pull_request:
branches: [ main ]
workflow_dispatch:
jobs:
qt-linux-arm64:
runs-on: arm64-native
steps:
- uses: actions/checkout@v4
- name: Install build dependencies
run: |
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y \
build-essential cmake ninja-build qt6-base-dev \
imagemagick file curl
- name: Configure + build
run: |
set -eu
cmake -S . -B build-out -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build-out --parallel "$(nproc)"
- name: Build AppImage (arm64)
run: |
set -eu
rm -rf AppDir artifacts
mkdir -p AppDir/usr/bin AppDir/usr/share/applications AppDir/usr/share/icons/hicolor/256x256/apps artifacts
cp build-out/qt_tray_demo AppDir/usr/bin/qt_tray_demo
chmod +x AppDir/usr/bin/qt_tray_demo
convert build/appicon.svg -resize 256x256 AppDir/usr/share/icons/hicolor/256x256/apps/qt_tray_demo.png
cat > AppDir/usr/share/applications/qt_tray_demo.desktop <<'DESKTOP'
[Desktop Entry]
Type=Application
Name=Qt Tray Demo
Exec=qt_tray_demo
Icon=qt_tray_demo
Terminal=false
Categories=Utility;
DESKTOP
curl -L -o linuxdeploy.AppImage https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-aarch64.AppImage
curl -L -o linuxdeploy-plugin-qt.AppImage https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-aarch64.AppImage
chmod +x linuxdeploy.AppImage linuxdeploy-plugin-qt.AppImage
export QMAKE=qmake6
APPIMAGE_EXTRACT_AND_RUN=1 ./linuxdeploy.AppImage --appdir AppDir \
-e AppDir/usr/bin/qt_tray_demo \
-d AppDir/usr/share/applications/qt_tray_demo.desktop \
-i AppDir/usr/share/icons/hicolor/256x256/apps/qt_tray_demo.png \
--plugin qt --output appimage
generated=$(ls -1 *.AppImage | head -n 1)
out="artifacts/qt_tray_demo-linux-arm64-run${{ github.run_number }}.AppImage"
mv "$generated" "$out"
chmod +x "$out"
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: qt_tray_demo-linux-arm64-run${{ github.run_number }}
path: artifacts/
retention-days: 14

15
CMakeLists.txt Normal file
View File

@ -0,0 +1,15 @@
cmake_minimum_required(VERSION 3.16)
project(qt_tray_demo LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
find_package(Qt6 REQUIRED COMPONENTS Widgets)
add_executable(qt_tray_demo
src/main.cpp
)
target_link_libraries(qt_tray_demo PRIVATE Qt6::Widgets)

5
build/appicon.svg Normal file
View File

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
<rect width="256" height="256" rx="28" fill="#10b981"/>
<rect x="48" y="48" width="160" height="160" rx="20" fill="#ffffff" fill-opacity="0.2"/>
<circle cx="128" cy="128" r="42" fill="#ffffff"/>
</svg>

After

Width:  |  Height:  |  Size: 296 B

39
src/main.cpp Normal file
View File

@ -0,0 +1,39 @@
#include <QAction>
#include <QApplication>
#include <QMainWindow>
#include <QMenu>
#include <QSystemTrayIcon>
#include <QVBoxLayout>
#include <QLabel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
app.setApplicationName("qt_tray_demo");
QMainWindow window;
window.setWindowTitle("Qt Tray Demo");
auto *central = new QWidget();
auto *layout = new QVBoxLayout(central);
layout->addWidget(new QLabel("Qt test app window (tray + window)."));
layout->addWidget(new QLabel("Close hides to tray; use tray menu to quit."));
window.setCentralWidget(central);
window.resize(720, 420);
auto *tray = new QSystemTrayIcon(QIcon::fromTheme("applications-system"), &app);
auto *menu = new QMenu();
QAction *showAction = menu->addAction("Show Window");
QAction *quitAction = menu->addAction("Quit");
QObject::connect(showAction, &QAction::triggered, [&window]() {
window.show();
window.raise();
window.activateWindow();
});
QObject::connect(quitAction, &QAction::triggered, &app, &QApplication::quit);
tray->setContextMenu(menu);
tray->setToolTip("Qt Tray Demo");
tray->show();
QObject::connect(&window, &QMainWindow::windowTitleChanged, [](){});
window.show();
return app.exec();
}