Skip to main content
Spring naar inhoud

Instellen op Windows

Uw C++ toepassing voorbereiden voor Windows

Inleiding

Qt heeft uitstekende Windows-ondersteuning, waardoor applicaties die gebruikmaken van Qt en KDE's extra-cmake-modules weinig aanpassingen nodig hebben om goed te werken op Windows.

Er zijn drie zaken nodig:

De ontwerpblauwdruk is nodig om alle afhankelijkheden samen te bundelen met de toepassing om een uitvoerbaar bestand te genereren.

De preprocessor-aanwijzing #ifdef Q_OS_WIN kan worden gebruikt om code te schrijven die alleen van toepassing is wanneer de toepassing op Windows wordt gebouwd. Dit is minstens één keer nodig om de Breeze-stijl aan de toepassing op te leggen, zodat deze er goed uitziet op Windows, maar afhankelijk van de toepassing kan dit vaker nodig zijn.

Het bundelen van de benodigde pictogrammen voor de toepassing om op Windows te werken is de meest complexe stap, maar zowel KDE's extra-cmake-modules (ECM) als Qt bieden manieren om deze taak te vereenvoudigen.

Ontwerpblauwdruk

Om te beginnen moet u eerst KDE-software bouwen op Windows met Craft volgen, zodat u een functionele Craft-blauwdruk krijgt en uw applicatie in ieder geval op Windows kunt bouwen.

Zodra u het project kunt bouwen, krijgt u compilatie- en runtimefouten te zien. Deze fouten helpen je bij het oplossen van eventuele compatibiliteitsproblemen met Windows.

Breeze-stijl

De Kirigami-handleiding zou al grotendeels compatibel moeten zijn met Windows, maar de stappen die hiervoor nodig zijn, moeten expliciet worden vermeld.

De twee aanpassingen die gedaan moeten worden om ervoor te zorgen dat de Breeze-stijl wordt gebruikt, zijn: het instellen van de QStyle op breeze en het instellen van de Qt Quick Controls-stijl op org.kde.desktop.

Een QStyle bepaalt grotendeels het uiterlijk van een QtWidgets-toepassing. Dit is nodig in onze QtQuick-toepassing omdat we de toepassing initialiseren met QApplication (traditioneel gebruikt met QtWidgets).

Een Qt Quick Controls-stijl daarentegen bepaalt grotendeels het uiterlijk van een QtQuick-toepassing. Dit heeft invloed op hoe QML-besturingselementen eruit zullen zien. De org.kde.desktop-stijl van KDE (ook wel bekend als qqc2-desktop-style) is speciaal en probeert duplicatie te voorkomen door stijlelementen af ​​te leiden van de QStyle van de toepassing (vandaar het gebruik van een QApplication). Op deze manier kunnen QtWidgets en QtQuick-toepassingen er grotendeels hetzelfde uitzien en stijlcomponenten hergebruiken.

QtQuick / Kirigami-toepassingen moeten beide instellingen in de C++-code configureren. Om de QStyle in te stellen, moet deze op twee plaatsen worden toegevoegd.

In Craft:

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

En in C++:

QApplication::setStyle("breeze");

Dit is wat in de Kirigami-handleiding wordt gebruikt. U kunt de Breeze-stijl ook laden, maar alleen op Windows waar dit het meest relevant is, met behulp van een ifdef:

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

De Qt Quick Controls-stijl moet op drie plaatsen worden toegevoegd.

In Craft:

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

In C++, waar het voorwaardelijk moet zijn:

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

En optioneel in CMake, op een van de volgende twee manieren:

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

Omdat het een runtime-afhankelijkheid is, hoeft deze niet te worden ingesteld in CMake, dat tijdens het compileren wordt gebruikt. Dit kan echter wel aan uzelf en aan anderen aangeven of de omgeving correct is en of de resulterende toepassing kan worden uitgevoerd, waardoor u ontbrekende pakketten of configuratiefouten gemakkelijker kunt opsporen.

De opdracht find_package() zoekt specifiek naar de CMake-configuratiebestanden voor qqc2-desktop-style, terwijl ecm_find_qmlmodule() minder strikt is en alleen zoekt naar de QML-module. Voor laatstgenoemde is het vereist dat u ECMFindQmlModule opneemt:

include(ECMFindQmlModule)

Te leveren pictogrammen

Om de toepassing Breeze-pictogrammen te laten gebruiken, moet u allereerst KIconThemes toevoegen aan uw project.

Hierna zijn enkele CMake-opdrachten nodig om uw toepassingspictogram te bundelen met de toepassing.

KIconThemes

Dit kan worden gedaan met de volgende drie stappen:

  • Het toevoegen als een afhankelijkheid in Craft:
def setDependencies(self):
    self.runtimeDependencies["kde/frameworks/tier3/kiconthemes"] = None
  • Het toevoegen als een afhankelijkheid in CMake:
find_package(KF6 REQUIRED COMPONENTS IconThemes)

# ...

target_link_libraries(myapp
    PRIVATE
    # ...
    KF6::IconThemes
)
  • Het gebruiken in de C++-code, in het bestand main.cpp:
#include <KIconTheme>

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

Merk op dat hoewel de projectnaam en de CMake-aanroep het meervoud gebruiken (KIconThemes, KF6IconThemes), de C++-aanroep het enkelvoud gebruikt (KIconTheme).

KIconThemes moet worden geïnitialiseerd voordat de toepassing wordt gestart.

Toepassingspictogram

Als uw applicatie een pictogram heeft, moet dit aan uw project worden toegevoegd, zowel als een QML-hulpbron als onderdeel van de pictograminstallatie.

Normaal gesproken kan op Linux het toepassingspictogram eenvoudig in de juiste map worden geïnstalleerd, waarna het pictogram door de toepassing wordt opgehaald wanneer dat nodig is. Meestal bestaat het toepassingspictogram uit een primair SVG-pictogram, gecombineerd met meerdere PNG-pictogrammen in verschillende formaten.

Het installeren van het SVG-pictogram gebeurt als volgt in CMake:

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

Het installeren van de PNG-pictogrammen gaat als volgt:

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)

Wanneer het toepassingspictogram op Linux wordt geïnstalleerd, wordt een PNG-pictogram zoals 48-apps-myapp.png geplaatst in ${INSTALL_PREFIX}/share/icons/hicolor/48x48/apps/myapp.png en een SVG-pictogram in ${INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/org.kde.myapp.svg, waarbij ${INSTALL_PREFIX} meestal staat voor /usr, /usr/local of ~/.local. Merk op dat in het geval van PNG's de pictogramnaam wordt vertaald naar het pad dat het in het bestandssysteem zal hebben.

U kunt meer lezen over het installeren van bestanden in Handmatig KDE-software bouwen: De installatiestap.

Zodra het pictogram op deze manier is geïnstalleerd, kan het in QML-code eenvoudig worden aangeroepen met myapp of org.kde.myapp, zoals ook zou gebeuren vanuit QIcon::fromTheme(). Dit kan worden gebruikt met elk QML-besturingselement dat een eigenschap icon.name heeft.

Windows heeft geen dergelijke standaardmap en het installeren van het pictogram heeft geen effect; het moet met de applicatie worden gebundeld. Om dit te doen, kan de PNG naar de eigen installatiemap worden gestuurd met behulp van ecm_add_app_icon() en kan een PNG- of SVG-bestand in de toepassing worden ingesloten als een Qt-hulpbronbestand in ecm_add_qml_module() of ecm_target_qml_sources().

Het PNG-toepassingspictogram is geïnstalleerd met:

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

En het belangrijkste toepassingspictogram is als Qt-hulpbron meegeleverd met:

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

Hierdoor wordt het toepassingspictogram beschikbaar als een Qt-hulpbron onder qrc:/qt/qml/org/kde/myapp/org.kde.myapp.svg. Dit kan worden gebruikt met elk QML-besturingselement dat een eigenschap icon.source heeft.

Het pad RESOURCES is afhankelijk van de locatie van de pictogrammen. Traditioneel wordt een map icons/ aangemaakt in de hoofdmap van het project voor het opslaan van alle pictogrammen, aangezien deze niet echt als bronbestanden worden beschouwd.

Nadat de pictogrammen zijn geïnstalleerd (voor Linux) en gebundeld (voor Windows en Android), kunt u ze in de code instellen. In QML-code moet u, voor compatibiliteit met zowel Windows als Android, het gebundelde pictogram gebruiken; in C++-code, met name bij het instellen van het vensterpictogram, kunt u standaard het thema-pictogram gebruiken en het gebundelde pictogram als terugvaloptie met QIcon::fromTheme() in de aanroep van QGuiApplication::setWindowIcon():

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

Kirigami-pictogrammen

Hoewel Windows geen standaardmap heeft voor het installeren van pictogrammen uit een pictogramthema, is het mogelijk om de benodigde Breeze-pictogrammen samen met uw Windows-toepassing te bundelen.

Dit wordt automatisch door Craft gedaan wanneer KIconThemes correct is ingesteld voor het project en Breeze-pictogrammen als afhankelijkheid in uw project zijn opgenomen.

Om KIconThemes in te stellen, zie het bovenstaande gedeelte KIconThemes.

Om Breeze-pictogrammen als afhankelijkheid aan uw project toe te voegen, voegt u dit toe aan uw Craft-blauwdruk:

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

Op deze manier hoeft u geen Breeze-pictogrammen handmatig als hulpbron in uw toepassing te bundelen: u kunt gewoon een QIcon::fromTheme()-naam gebruiken, zoals kde of application-exit-symbolic.

Gebouw

Om uw toepassing op Windows te bouwen, volgt u KDE-software bouwen op Windows met Craft: uw eigen projecten bouwen op Windows.

CI-bouwsels

Als het project correct is geconfigureerd om op Windows te bouwen en gebruikmaakt van de KDE-infrastructuur voor het hosten van de code (KDE Invent), is het mogelijk om Windows CI/CD-taken te configureren.

Om dit te doen, moet u de relevante CI-sjablonen voor Windows toevoegen met een .gitlab-ci.yaml-bestand en uw afhankelijkheden vermelden in een .kde-ci.yaml-bestand zoals vermeld in Continuous Integration System.

Probleemoplossing

Als u problemen ondervindt bij het aanpassen van uw toepassing aan Windows, kunt u de volgende rooms op Matrix bezoeken: