Qt-ohjelmointi
Qt-sovelluksen julkaiseminen

Näillä ohjeilla voit julkaista sovelluksesi eli tehdä siitä version, joka voidaan suorittaa myös koneella, jossa ei ole Qt:ta.

  1. Valitse Qt:ssa release moodi (kuva alla)
  2. Käännä sovellus
  3. Avaa komentokehote kansioon, jossa on sovellus windeployqt6. Minulla se on kansiossa c:\Qt\6.5.2\mingw_64\bin
  4. Anna komento
    .\windeployqt6 "C:\qt_projects\myapp\build\release\myapp.exe"
    
    Jossa mainittu polku osoittaa siihen kansioon, jossa sovelluksesi exe-file sijaitsee.
  5. Jos siirrät nyt kansion release sisällön toiseen Windows-koneeseen, sen pitäisi toimia siinäkin.

Asennustiedoston luominen

Edellisessä esimerkissä on se vika, että sovelluksen julkaisijan tulee toimittaa koko kansio. Inno Setup sovelluksen avulla voidaan luoda yksi tiedosto, jonka avulla sovellus voidaan asentaa Windows koneelle.

Tämä ohje opastaa Qt Widget -sovelluksen asennuspaketin luomisessa Inno Setup -työkalulla.

Lataa ja asenna Inno Setup https://jrsoftware.org/isdl.php

Seuraavassa esimerkissä teen luomastani MyWeather Qt Widget sovelluksesta asennustiedoston. Tein asennuksesta videon Setupin luominen

Esivalmistelut

1. Käännä sovellus Release-tilassa

Ennen asennuspaketin luomista sovellus täytyy kääntää Release-tilassa:

Tämän jälkeen build kansiosta löytyy myweather.exe tiedosto.

2. Kerää Qt-riippuvuudet windeployqt-työkalulla

Qt-sovellukset tarvitsevat mukaan useita DLL-tiedostoja ja resursseja. Qt:n mukana tuleva windeployqt työkalu kerää nämä automaattisesti.

Avaa komentokehote build kansioon ja suorita:

c:\Qt\6.9.1\mingw_64\bin\windeployqt.exe myweather.exe

Tämä komento kopioi kaikki tarvittavat Qt DLL-tiedostot, pluginit ja resurssit samaan kansioon sovelluksen kanssa.

Huom: Jos käytät Visual Studiota, käytä windeployqt --release myweather.exe

Inno Setup -scriptin luominen

1. Luo myweather.iss tiedosto

Luo tiedosto myweather.iss projektin juureen

; myweather Setup Script for Inno Setup
; Requires Inno Setup 6.0 or later

#define MyAppName "My Weather"
#define MyAppVersion "0.1"
#define MyAppPublisher "Your Name/Company"
#define MyAppExeName "myweather.exe"
#define MyAppURL "https://yourwebsite.com"

[Setup]
; Perusasetukset
AppId={{YOUR-UNIQUE-GUID-HERE}}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
LicenseFile=
InfoBeforeFile=
InfoAfterFile=
OutputDir=output
OutputBaseFilename=MyWeatherSetup
SetupIconFile=
Compression=lzma
SolidCompression=yes
WizardStyle=modern
PrivilegesRequired=admin

; Kieliasetukset
ShowLanguageDialog=auto

[Languages]
Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl"
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
; Pääohjelma ja kaikki riippuvuudet
Source: "build\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent

[Code]
// Tarkista että .NET Framework tai muut riippuvuudet on asennettu
function InitializeSetup(): Boolean;
begin
  Result := True;
end;

2. Luo uniikki GUID

Korvaa {YOUR-UNIQUE-GUID-HERE} uniikilla GUID:lla. Voit luoda sen esim. PowerShellissä:

[guid]::NewGuid().ToString().ToUpper()

Tai online-työkalulla: https://www.guidgenerator.com/

Esimerkki: AppId={{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}}

3. Lisäasetukset (valinnainen)

Sovelluskuvake

Jos haluat lisätä custom-ikonin:

  1. Luo .ico tiedosto (esim. app-icon.ico)
  2. Lisää rivi: SetupIconFile=myweather\app-icon.ico

Lisenssi

Jos haluat näyttää lisenssin asennuksen aikana:

  1. Luo LICENSE.txt tiedosto
  2. Lisää rivi: LicenseFile=LICENSE.txt

Määritystiedostot

Jos sovelluksesi tarvitsee konfiguraatiotiedostoja (esim. backend URL):

[Files]
Source: "myweather\config\*"; DestDir: "{app}\config"; Flags: ignoreversion

Asennuspaketin luominen

Käännä setup Inno Setup Compilerilla

Vaihtoehto A: Graafinen käyttöliittymä

  1. Avaa Inno Setup Compiler
  2. Valitse File → Open ja avaa myweather.iss
  3. Valitse Build → Compile (tai paina F9)
  4. Setup-tiedosto luodaan output kansioon nimellä MyWeatherSetup.exe

Vaihtoehto B: Komentorivi

"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" myweather.iss

Ikoni

Edellä mainitussa iss-tiedostossa määritettävä ikoni tulee asennusohjelmalle. Qt-sovelluksen ikoni voidaan määrittää seuraaavasti

  1. lisää projektin juureen tiedosto appicon.rc, jossa rivi
    IDI_ICON1 ICON "favicon.ico"
    
  2. lisää CmakeLists.txt tiedostoon rivi appicon.rc seuraavasti;
    set(PROJECT_SOURCES
            main.cpp
            mainwindow.cpp
            mainwindow.h
            mainwindow.ui
            appicon.rc
    )
    

Huomioitavaa

Qt-riippuvuudet

Sovellus tarvitsee seuraavat Qt-komponentit (windeployqt hoitaa nämä):

  • Qt6Core.dll / Qt5Core.dll
  • Qt6Gui.dll / Qt5Gui.dll
  • Qt6Widgets.dll / Qt5Widgets.dll
  • Qt6Network.dll / Qt5Network.dll
  • Qt6SerialPort.dll / Qt5SerialPort.dll
  • Eri platformpluginit (platforms\qwindows.dll)
  • Styles-pluginit
  • Kääntäjän runtime-kirjastot (esim. libgcc_s_seh-1.dll, libstdc++-6.dll)

Ympäristömuuttujat

Jos sovelluksesi käyttää environment.h/cpp tiedostoja backend URL:n määrittämiseen, varmista että:

  1. Joko URL on kovakoodattu Release-versioon
  2. Tai sovellus lukee sen konfiguraatiotiedostosta
  3. Tai käyttäjä voi määrittää sen ensimmäisellä käynnistyskerralla

Koko

Setup-tiedoston koko on tyypillisesti 30-50 MB Qt-sovelluksille kaikkien riippuvuuksien kanssa.

Päivitykset

Kun julkaiset uuden version:

  1. Päivitä #define MyAppVersion arvoa
  2. Käännä uusi setup samalla tavalla
  3. Vanha versio poistetaan automaattisesti ennen uuden asentamista (sama AppId)
Julkaisu GitHubin kautta

Voit automatisoida asennuspaketin luomisen ja julkaisun GitHub Actions -työkalulla. Tämä vaatii hieman lisäkonfiguraatiota GitHub-repositoriossasi. Seuraavan esimerkin avulla voit luoda GitHub Actionin, joka kääntää Qt-sovelluksesi ja luo asennuspaketin aina, kun päivität päähaaraan (main branch). Esimerkissä käytetään Inno Setupia asennuspaketin luomiseen. Asennuspaketti viedään automaattisesti erilliselle web-palvelimelle SCP:llä SSH-yhteyden yli .

Tein videon GitHub Actionsin käytöstä Qt-sovelluksen julkaisuun: Qt-sovelluksen julkaisu GitHub Actionsilla

Luo GitHub-repositoriosi juureen kansio .github/workflows ja lisää sinne tiedosto build-and-deploy.yml seuraavalla sisällöllä:


name: Build and Deploy MyWeather

on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: windows-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.9.1'
        host: 'windows'
        target: 'desktop'
        arch: 'win64_msvc2022_64'
        modules: 'qtnetworkauth'

    - name: Configure CMake
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
        cmake -B build -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="${{ env.QT_ROOT_DIR }}"
      shell: cmd

    - name: Build
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
        cmake --build build
      shell: cmd

    - name: Deploy Qt dependencies
      run: windeployqt build/MyWeather.exe --release

    - name: Install Inno Setup
      run: |
        choco install innosetup -y
        refreshenv

    - name: Create installer
      run: iscc MyWeather.iss

    - name: Deploy to web server via SCP
      env:
        SSH_KEY: ${{ secrets.WEB_SERVER_SSH_KEY }}
        WEB_HOST: ${{ secrets.WEB_SERVER_HOST }}
        WEB_USER: ${{ secrets.WEB_SERVER_USER }}
        WEB_PATH: ${{ secrets.WEB_SERVER_PATH }}
      run: |
        # Save SSH key to file
        printf '%s\n' "$SSH_KEY" > deploy_key
        chmod 600 deploy_key

        # Upload file
        scp -i deploy_key -P 22 -o StrictHostKeyChecking=no output/MyWeatherSetup.exe "${WEB_USER}@${WEB_HOST}:${WEB_PATH}/"

        # Cleanup
        rm deploy_key
      shell: bash

Jotta saat edellisen toimimaan, sinun tulee määrittää SSH-avaimesi ja web-palvelimen tiedot GitHub Secrets -asetuksiin oheisen ohjeen mukaisesti: GitHub Secrets

Voit myös julkaista Qt-sovelluksesi GitHubin kautta käyttämällä GitHub Releases -ominaisuutta.

  1. Luo uusi release GitHub-repositoriossasi
  2. Lataa luotu setup-tiedosto (esim. MyWeatherSetup.exe) releaseen
  3. Käyttäjät voivat ladata ja asentaa sovelluksesi suoraan GitHubista

Seuraavassa on esimerkki GitHub Action -workflow'sta, joka luo release-paketin ja lataa asennustiedoston GitHub Releases -osioon aina, kun päivität release branchin.

name: Create GitHub Release

on:
  push:
    branches: [ release ]

permissions:
  contents: write

jobs:
  build-and-release:
    runs-on: windows-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Get version from CMakeLists.txt
      id: get_version
      run: |
        $version = Select-String -Path "CMakeLists.txt" -Pattern 'project\(MyWeather VERSION ([0-9.]+)\)' | ForEach-Object { $_.Matches.Groups[1].Value }
        if (-not $version) {
          $version = "1.0.0"
        }
        echo "VERSION=$version" >> $env:GITHUB_OUTPUT
        echo "Version: $version"
      shell: pwsh

    - name: Install Qt
      uses: jurplel/install-qt-action@v4
      with:
        version: '6.9.1'
        host: 'windows'
        target: 'desktop'
        arch: 'win64_msvc2022_64'
        modules: 'qtnetworkauth'

    - name: Configure CMake
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
        cmake -B build -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="${{ env.QT_ROOT_DIR }}"
      shell: cmd

    - name: Build
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
        cmake --build build
      shell: cmd

    - name: Deploy Qt dependencies
      run: windeployqt build/MyWeather.exe --release

    - name: Install Inno Setup
      run: |
        choco install innosetup -y
        refreshenv

    - name: Create installer
      run: iscc MyWeather.iss

    - name: Create GitHub Release
      uses: softprops/action-gh-release@v1
      with:
        tag_name: v${{ steps.get_version.outputs.VERSION }}
        name: MyWeather v${{ steps.get_version.outputs.VERSION }}
        body: |
          ## MyWeather v${{ steps.get_version.outputs.VERSION }}

          ### Lataa asennusohjelma
          Lataa MyWeatherSetup.exe alta ja suorita se asentaaksesi sovelluksen.

          ### Muutokset
          - Automaattisesti luotu release release-branchista

          ---
        Luotu automaattisesti GitHub Actionsilla
        files: |
          output/MyWeatherSetup.exe
        draft: false
        prerelease: false
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Sinun tulee kuitenkin tehdä GitHubissa repon asetuksissa seuraavat määritykset:

  1. Repository → Settings
  2. Vasemmalta Actions → General
  3. Alhaalla kohdassa Workflow permissions:
    • Valitse "Read and write permissions"
    • Varmista että "Allow GitHub Actions to create and approve pull requests" on päällä
  4. Tallenna Save



Toggle Menu