Skip to main content
Passa al contenuto

Installazione di Windows

Preparazione dell'applicazione C++ per Windows

Introduzione

Qt ha un ottimo supporto Windows, quindi le applicazioni che utilizzano Qt e i moduli-extra-cmake di KDE non richiederanno molte modifiche per funzionare correttamente su Windows.

Sono necessarie tre cose:

Il progetto Craft è necessario per raggruppare tutte le dipendenze insieme all'applicazione per generare un eseguibile.

La direttiva del preprocessore "#ifdef Q_OS_WIN" può essere utilizzata per scrivere codice che verrà applicato solo quando l'applicazione è creata su Windows. Ciò è necessario almeno una volta per forzare lo stile Breeze nell'applicazione in modo che appaia bene su Windows, ma a seconda dell'applicazione potrebbe richiederne di più.

Raggruppare le icone necessarie affinché l'applicazione funzioni su Windows è il passaggio più complesso, ma sia i moduli extra-cmake-moduli (ECM) di KDE che Qt forniscono i mezzi per rendere questo lavoro più semplice.

Progetto Craft

Per iniziare devi prima seguire Creazione di software KDE su Windows con Craft in modo da ottenere un progetto Craft funzionale e poter almeno creare la tua applicazione su Windows.

Una volta che sarai in grado di creare il progetto, riceverai errori di compilazione e di runtime che ti aiuteranno a risolvere eventuali problemi di compatibilità con Windows.

Stile Brezza

Il tutorial di Kirigami dovrebbe già essere per lo più compatibile con Windows, ma i passaggi necessari per raggiungere questo obiettivo devono essere resi espliciti.

Le due modifiche che dovrebbero essere fatte per garantire che venga utilizzato lo stile Breeze sono impostare QStyle su breeze e impostare lo stile Qt Quick Controls su org.kde.desktop.

Un QStyle è ciò che controlla la maggior parte dell'aspetto di un'applicazione QtWidgets. Ciò è necessario nella nostra applicazione QtQuick perché inizializziamo l'applicazione con QApplication (tradizionalmente utilizzato con QtWidgets).

Uno stile Qt Quick Controls d'altra parte controlla la maggior parte dell'aspetto di un'applicazione QtQuick. Ciò influisce sull'aspetto dei controlli QML. Lo stile org.kde.desktop di KDE (altrimenti noto come qqc2-desktop-style) è speciale e tenta di rimuovere la duplicazione derivando elementi di stile dal QStyle dell'applicazione (ecco perché viene utilizzata una QApplication). In questo modo, le applicazioni QtWidgets e QtQuick possono avere per lo più lo stesso aspetto e riutilizzare componenti di stile.

Le applicazioni QtQuick/Kirigami devono essere impostate entrambe nel codice C++. Per impostare il QStyle, è necessario aggiungerlo in due punti.

In Craft:

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

E in C++:

QApplication::setStyle("breeze");

Questo è ciò che viene utilizzato nel tutorial Kirigami. Altrimenti puoi caricare lo stile Breeze solo su Windows dove è più rilevante utilizzando un ifdef:

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

Lo stile Qt Quick Controls deve essere aggiunto in tre punti.

In Craft:

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

In C++, dove deve essere condizionale:

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

E facoltativamente in CMake, in due modi:

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

Poiché si tratta di una dipendenza di runtime, non è necessario impostarla in CMake che viene utilizzato in fase di compilazione. Tuttavia, questo può segnalare a te stesso e agli altri se l'ambiente è corretto e sarà in grado di eseguire l'applicazione risultante, consentendoti di trovare più facilmente pacchetti mancanti o configurazioni errate.

Il comando find_package() cerca specificamente i file di configurazione CMake per qqc2-desktop-style, mentre ecm_find_qmlmodule() è meno rigido e cerca solo il modulo QML. Quest'ultimo richiede l'inclusione di ECMFindQmlModule:

include(ECMFindQmlModule)

Icone rilasciate

La prima cosa necessaria affinché l'applicazione utilizzi le icone Breeze è includere KIconThemes nel tuo progetto.

Successivamente, sono necessari alcuni comandi CMake per raggruppare l'icona con l'applicazione.

KIconThemes

Questo può essere fatto con i seguenti tre passaggi:

  • Aggiungendolo come dipendenza in Craft:
def setDependencies(self):
    self.runtimeDependencies["kde/frameworks/tier3/kiconthemes"] = None
  • Aggiungendolo come dipendenza in CMake:
find_package(KF6 REQUIRED COMPONENTS IconThemes)

# ...

target_link_libraries(myapp
    PRIVATE
    # ...
    KF6::IconThemes
)
  • Usandolo nel codice C++, nel file main.cpp:
#include <KIconTheme>

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

Tieni presente che sebbene il nome del progetto e la chiamata CMake utilizzino il plurale (KIconThemes, KF6IconThemes), la chiamata C++ utilizza il singolare (KIconTheme).

KIconThemes deve essere inizializzato prima dell'applicazione.

Icona dell'applicazione

Se la tua applicazione ha un'icona, deve essere aggiunta al tuo progetto sia come risorsa QML sia come parte dell'installazione dell'icona.

Normalmente su Linux l'icona dell'applicazione può essere semplicemente installata nella directory corretta e l'icona verrà recuperata dall'applicazione quando necessario. Di solito l'icona dell'applicazione è costituita da un'icona SVG primaria, abbinata a più dimensioni di icone PNG.

L'installazione dell'icona SVG viene eseguita in questo modo in CMake:

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

E l'installazione delle icone PNG viene eseguita in questo modo:

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)

Quando l'icona dell'applicazione è installata su Linux, un'icona PNG come 48-apps-myapp.png va a ${INSTALL_PREFIX}/share/icons/hicolor/48x48/apps/myapp.png e un'icona SVG va a ${INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/org.kde.myapp.svg, dove ${INSTALL_PREFIX} solitamente sta per /usr, /usr/local o ~/.local. Nota come nel caso dei PNG il nome dell'icona si traduce nel percorso che avrà nel filesystem.

Puoi leggere ulteriori informazioni sull'installazione dei file in Creazione manuale del software KDE: il passaggio di installazione.

Una volta installata l'icona in questo modo, nel codice QML, può essere richiamata semplicemente con myapp o org.kde.myapp, come verrebbe richiamata da QIcon::fromTheme(). Questo può essere utilizzato con qualsiasi controllo QML che abbia una proprietà icon.name.

Windows non dispone di una cartella standard di questo tipo e l'installazione dell'icona non ha alcun effetto; deve essere fornito in bundle con l'applicazione. Per fare ciò, il PNG può essere inviato alla propria cartella di installazione utilizzando ecm_add_app_icon() e un file PNG o SVG può essere incorporato nell'applicazione come file di risorse Qt in ecm_add_qml_module() o ecm_target_qml_sources().

L'icona dell'applicazione PNG viene installata con:

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

E l'icona dell'applicazione principale è inclusa come risorsa Qt con:

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

Ciò renderà l'icona dell'applicazione disponibile come risorsa Qt in qrc:/qt/qml/org/kde/myapp/org.kde.myapp.svg. Questo può essere utilizzato con qualsiasi controllo QML che abbia una proprietà icon.source.

Il percorso "RISORSE" dipende dal luogo in cui si trovano le icone. Tradizionalmente, viene creata una cartella icons/ alla radice del progetto per memorizzare tutte le icone, poiché non contano realmente come file sorgente.

Dopo che le icone sono state installate (per Linux) e raggruppate (per Windows e Android), puoi impostarle nel codice. Nel codice QML, per compatibilità sia con Windows che con Android, dovresti utilizzare l'icona in bundle; nel codice C++, in particolare quando si imposta l'icona della finestra, è possibile utilizzare l'icona del tema per impostazione predefinita e l'icona in bundle come fallback con QIcon::fromTheme() nella chiamata a QGuiApplication::setWindowIcon():

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

Icone di Kirigami

Sebbene Windows non disponga di una directory standard in cui installare le icone da un tema di icone, è possibile raggruppare le icone Breeze necessarie insieme all'applicazione Windows.

Questo viene eseguito automaticamente da Craft quando KIconThemes è configurato correttamente per il progetto e le icone Brezza sono incluse come dipendenza nel tuo progetto.

Per impostare KIconThemes, vedi la sezione precedente KIconThemes.

Per aggiungere le icone Brezza come dipendenza per il tuo progetto, aggiungi questo al tuo progetto Craft:

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

In questo modo, non avrai bisogno di raggruppare manualmente nessuna icona Breeze nella tua applicazione come risorsa: puoi semplicemente usare un nome QIcon::fromTheme(), come kde o application-exit-symbolic.

Edificio

Per creare la tua applicazione su Windows, segui Creazione di software KDE su Windows con Craft: creazione di progetti su Windows.

Build CI

Se il progetto è stato configurato correttamente per essere basato su Windows e utilizza l'infrastruttura KDE per l'hosting del codice (KDE Invent), è possibile configurare lavori CI/CD di Windows.

Per fare ciò, dovrai aggiungere i modelli CI rilevanti per Windows con un file .gitlab-ci.yaml ed elencare le tue dipendenze in un file .kde-ci.yaml come menzionato in Sistema di integrazione continua.

Risoluzione dei problemi

Se riscontri problemi nell'adattare la tua applicazione a Windows, puoi visitare le seguenti stanze su Matrix: