commit 7b056fb78e8f1dd0b52d20efdc16f82acd70bb0c Author: OpenClaw Bot Date: Sat Mar 14 16:24:26 2026 +0000 Initial qt-tests tray app with split amd64/arm64 AppImage CI workflows diff --git a/.gitea/workflows/qt-linux-amd64.yml b/.gitea/workflows/qt-linux-amd64.yml new file mode 100644 index 0000000..3d84caf --- /dev/null +++ b/.gitea/workflows/qt-linux-amd64.yml @@ -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 diff --git a/.gitea/workflows/qt-linux-arm64.yml b/.gitea/workflows/qt-linux-arm64.yml new file mode 100644 index 0000000..f8a3533 --- /dev/null +++ b/.gitea/workflows/qt-linux-arm64.yml @@ -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 diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9f468f2 --- /dev/null +++ b/CMakeLists.txt @@ -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) diff --git a/build/appicon.svg b/build/appicon.svg new file mode 100644 index 0000000..ff6f4d4 --- /dev/null +++ b/build/appicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..15ea1e0 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include +#include + +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(); +}