Skip to main content
Gå till innehåll

Inställning för Windows

Förbereda C++ programmet för Windows

Inledning

Qt har utmärkt Windows-stöd, så program som använder Qt och KDE:s extra-cmake-modules kräver inte många modifieringar för att fungera korrekt på Windows.

Tre saker behövs:

En Craft-plan behövs för att paketera alla beroenden tillsammans med programmet för att generera en körbar fil.

Preprocessordirektivet #ifdef Q_OS_WIN kan användas för att skriva kod som bara gäller när programmet är byggd på Windows. Det behövs minst en gång för att tvinga programmet att använda Breeze-stilen så att det ser bra ut på Windows, men beroende på programmet kan det kräva mer.

Att samla de nödvändiga ikonerna för att programmet ska fungera på Windows är det mest komplexa steget, men både KDE:s extra-cmake-moduler (ECM) och Qt tillhandahåller sätt att göra det här jobbet enklare.

Craft-plan

För att komma igång måste du först följa Building KDE software on Windows with Craft så att du får en fungerande Craft-plan och åtminstone kan bygga programmet på Windows.

När du väl har kunnat bygga projektet får du kompilerings- och körfel som hjälper dig att åtgärda eventuella kompatibilitetsproblem med Windows.

Breeze-stil

Kirigami-handledningen borde redan vara i stort sett kompatibel med Windows, men stegen som behövs för att uppnå det behöver tydliggöras.

De två modifieringar som bör göras för att säkerställa att Breeze-stilen används är att ställa in QStyle till breeze och att ställa in Qt Quick Controls-stilen till org.kde.desktop.

En QStyle är det som styr majoriteten av utseendet på en för ett program med QtWidgets. Det behövs i vårt QtQuick-program eftersom vi initierar programmet med QApplication (traditionellt använt med QtWidgets).

En Qt Quick kontrollstil styr å andra sidan majoriteten av utseendet på ett QtQuick-program. Det påverkar hur QML-kontrollerna kommer att se ut. KDE:s stil org.kde.desktop(även känd som qqc2-desktop-style) är speciell och försöker ta bort dubbelarbete genom att härleda stilelement från programmets QStyle (vilket är orsaken att QApplication används). På så sätt kan QtWidgets och QtQuick-program i stort sett se likadana ut och återanvända stilkomponenter.

QtQuick/Kirigami-program behöver ange båda i C++ kod. För att ange QStyle måste den läggas till på två ställen.

I Craft:

def setDependencies(self):
    self.runtimeDependencies["kde/plasma/breeze"] = None

Och i C++:

QApplication::setStyle("breeze");

Det är vad som används i Kirigami-handledningen. Du kan annars bara ladda Breeze-stilen i Windows där det är mest relevant med hjälp av en ifdef:

#ifdef Q_OS_WIN
    QApplication::setStyle("breeze");
#endif

Qt Quick kontrollstilen behöver läggas till på tre ställen.

I Craft:

def setDependencies(self):
    self.runtimeDependencies["kde/frameworks/tier3/qqc2-desktop-style"] = None

I C++, där den måste vara villkorligt:

if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE"))
{
    QQuickStyle::setStyle("org.kde.desktop");
}

Och valfritt i CMake, på ett av två sätt:

find_package(KF6 REQUIRED COMPONENTS QQC2DesktopStyle)
# or
ecm_find_qmlmodule(org.kde.desktop REQUIRED)

Eftersom det är ett körtidsberoende behöver det inte anges i CMake, som används vid kompilering. Det kan dock signalera till dig själv och andra om miljön är korrekt och att den resulterande programmet kan köras, vilket gör att du lättare kan hitta saknade paket eller felaktiga konfigurationer.

Kommandot find_package() söker specifikt efter CMake-konfigurationsfiler för qqc2-desktop-style, medan ecm_find_qmlmodule() är mindre strikt och söker bara efter QML-modulen. Den senare kräver att du inkluderar ECMFindQmlModule:

include(ECMFindQmlModule)

Leverera ikoner

Det första som behövs för att programmet ska använda Breeze-ikoner är att inkludera KIconThemes i projektet.

Efter det behövs några CMake-kommandon för att paketera programikonen med programmet.

KIconThemes

Det kan göras med följande tre steg:

  • Lägga till det som ett beroende i Craft:
def setDependencies(self):
    self.runtimeDependencies["kde/frameworks/tier3/kiconthemes"] = None
  • Lägga till det som ett beroende i CMake:
find_package(KF6 REQUIRED COMPONENTS IconThemes)

# ...

target_link_libraries(myapp
    PRIVATE
    # ...
    KF6::IconThemes
)
  • Använda det i C++ kod, i filen main.cpp:
#include <KIconTheme>

// ...
int main(int argc, char* argv[])
{
    KIconTheme::initTheme();
    QApplication app(argc, argv);
    // ...
}

Observera att även om projektnamnet och anropet till CMake använder pluralis (KIconThemes, KF6IconThemes), använder anropet till C++ singularis (KIconTheme).

KIconThemes måste initialiseras före programmet.

Programikon

Om programmet har en ikon måste den läggas till i projektet både som en QML-resurs och som en del av ikoninstallationen.

Vanligtvis kan programikonen på Linux enkelt installeras i rätt katalog, och ikonen hämtas av programmet när den behövs. Vanligtvis består programikonen av en primär SVG-ikon, parad med flera PNG-ikonstorlekar.

Installation av SVG-ikonen görs så här i CMake:

install(FILES ${PROJECT_SOURCE_DIR}/icons/org.kde.myapp.svg DESTINATION ${KDE_INSTALL_FULL_ICONDIR}/hicolor/scalable/apps)

Och installation av PNG-ikonerna görs så här:

ecm_install_icons(ICONS
    16-apps-myapp.png
    24-apps-myapp.png
    32-apps-myapp.png
    48-apps-myapp.png
    64-apps-myapp.png
    128-apps-myapp.png
    256-apps-myapp.png
    512-apps-myapp.png    
    DESTINATION share/icons)

När programikonen är installerad på Linux, placeras en PNG-ikon såsom 48-apps-myapp.png i ${INSTALL_PREFIX}/share/icons/hicolor/48x48/apps/myapp.png, och en SVG-ikon placeras i ${INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/org.kde.myapp.svg, där ${INSTALL_PREFIX} oftast står för /usr, /usr/local eller ~/.local. Observera hur ikonnamnet i PNG-fallet översätts till den sökväg den har i filsystemet.

Du kan läsa mer om att installera filer i Bygga KDE-programvara manuellt: Installationssteget.

När ikonen är installerad på det sättet, kan den enkelt anropas med myapp eller org.kde.myapp i QML-kod, precis som den skulle anropas från QIcon::fromTheme(). Det kan användas med vilken QML-kontroll som helst som har egenskapen icon.name.

Windows har ingen sådan standardkatalog, och installation av ikonen har ingen effekt. Den måste paketeras med programmet. För att göra det kan PNG-filen skickas till en egen installationskatalog med hjälp av ecm_add_app_icon() och en PNG- eller SVG-fil kan inbäddas i programmet som en Qt-resursfil i ecm_add_qml_module() eller ecm_target_qml_sources().

PNG-programikonen installeras med:

ecm_add_app_icon(myapp ICONS ${PROJECT_SOURCE_DIR}/icons/256-apps-myapp.png)

Och huvudprogrammets ikon är paketerad som en Qt-resurs med:

ecm_add_qml_module(myapp URI org.kde.myapp)
ecm_target_qml_sources(myapp SOURCES Main.qml RESOURCES ../icons/org.kde.myapp.svg)

Det gör programikonen tillgänglig som en Qt-resurs under qrc:/qt/qml/org/kde/myapp/org.kde.myapp.svg. Det kan användas med vilken QML-kontroll som helst som har egenskapen icon.source.

Sökvägen till RESURSER beror på var ikonerna finns. Traditionellt skapas katalogen icons/ i projektets rot för att lagra alla ikoner, eftersom de egentligen inte räknas som källfiler.

När ikonerna är installerade (för Linux) och paketerade (för Windows och Android) kan du ange det i koden. I QML-kod, för kompatibilitet med både Windows och Android, bör du använda den paketerade ikonen. I C++ kod, särskilt när du ställer in fönsterikonen, kan du normalt använda temaikonen och den paketerade ikonen som reserv med QIcon::fromTheme() i anropet till QGuiApplication::setWindowIcon():

QGuiApplication::setWindowIcon(QIcon::fromTheme("org.kde.myapp", QIcon(":/qt/qml/org/kde/myapp/org.kde.myapp.svg")));

Kirigami-ikoner

Även om Windows inte har en standardkatalog där ikoner från ett ikontema installeras, är det möjligt att paketera de nödvändiga Breeze-ikonerna tillsammans med Windows-programmet.

Det utförs automatiskt av Craft när KIconThemes är korrekt inställt för projektet och Breeze-ikoner ingår som ett beroende i projektet.

För att ställa in KIconThemes, se avsnittet KIconThemes ovan.

För att lägga till Breeze-ikoner som ett beroende i projektet, lägg till det i Craft-planen:

def setDependencies(self):
    # ...
    self.runtimeDependencies["kde/frameworks/tier1/breeze-icons"] = None

På så sätt behöver du inte manuellt paketera några Breeze-ikoner i programmet som en resurs: du kan bara använda namnet från QIcon::fromTheme(), till exempel kde eller application-exit-symbolic.

Bygga

För att bygga programmet för Windows, följ Building KDE software on Windows with Craft: Building your own projects on Windows.

Qt-byggen

Om projektet har konfigurerats korrekt för att bygga på Windows och använder KDE:s infrastruktur för kodhantering (KDE Invent), är det möjligt att konfigurera Windows CI/CD-jobb.

För att göra det måste relevanta CI-mallar för Windows läggas till med filen .gitlab-ci.yaml och lista dina beroenden i filen .kde-ci.yaml som nämns i Continuous Integration System.

Felsökning

Om du har problem med att anpassa programmet till Windows kan du besöka följande rum på Matrix: