Skip to main content
Перейти до вмісту

Робота у Windows

Приготування вашої програми на C++ до Windows

Вступ

У Qt передбачено чудову підтримку Windows, тому програми, що використовують Qt та модулі [extra-cmake-modules] (https://api.kde.org/ecm/) KDE, не потребуватимуть значних модифікацій для належної роботи у Windows.

Потрібно три речі:

План Craft потрібен для пов'язування усіх залежностей з програмою для створення виконуваного файла.

Директива препроцесора #ifdef Q_OS_WIN може бути використана для написання коду, який застосовуватиметься лише тоді, коли програма зібрана на Windows. Це потрібно принаймні один раз для примусового застосування стилю Breeze до програми, щоб вона добре виглядала на Windows, але залежно від програми може знадобитися більше разів.

Дописування до пакета необхідних піктограм для роботи програми у Windows є найскладнішим кроком, але як модулі extra-cmake (ECM) KDE, так і Qt надають засоби для спрощення цієї роботи.

План Craft

Для початку вам слід спочатку ознайомитися з інструкцією щодо збирання програмного забезпечення KDE для Windows за допомогою Craft, щоб отримати функціональний план Craft і мати змогу принаймні зібрати свою програму для Windows.

Після того, як ви зможете спробувати зібрати проект, ви отримаєте повідомлення про помилки компіляції та виконання, які допоможуть вам виправити будь-які проблеми сумісності з Windows.

Стиль Breeze

Підручник з Kirigami вже здебільшого сумісний з Windows, але кроки, необхідні для досягнення цієї мети, мають бути чітко описані.

Дві зміни, які слід зробити, щоб забезпечити використання стилю Breeze, це встановити QStyle у значення breeze та встановити стиль швидкого керування Qt на org.kde.desktop.

QStyle контролює більшу частину зовнішнього вигляду програми на QtWidgets. Він потрібен у нашій програмі на QtQuick, оскільки ми ініціалізуємо програму за допомогою QApplication (традиційно використовується з QtWidgets).

З іншого боку, стиль Qt Quick Controls керує більшою частиною зовнішнього вигляду програми на QtQuick. Це впливає на те, як виглядатимуть елементи керування QML. Стиль KDE org.kde.desktop (інакше відомий як qqc2-desktop-style) є особливим і призначений для усування дублювання, запозичуючи елементи стилю з QStyle програми (саме тому використовується QApplication). Таким чином, програми QtWidgets та QtQuick можуть виглядати здебільшого однаково та повторно використовувати компоненти стилю.

Програми QtQuick / Kirigami мають встановлювати обидва у коді C++. Для встановлення QStyle, його слід додати у двох місцях.

У Craft:

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

І у C++:

QApplication::setStyle("breeze");

Ось що використовується у покроковому підручнику з Kirigami. Крім того, ви можете завантажити стиль Breeze лише у вікнах, де це найбільш актуально, використовуючи ifdef:

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

Стиль Qt Quick Controls слід додати у трьох місцях.

У Craft:

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

У C++, де це має додаватися за виконання умови:

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

І додатково у CMake, в один з двох способів:

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

Оскільки це залежність середовища виконання, її не потрібно встановлювати в CMake, який використовується під час збирання. Однак це може сигналізувати вам та іншим, чи є середовище належним і чи зможе він запустити програму-результат, що дозволить вам легше знаходити пакети, яких не вистачає, або неправильні налаштування.

Команда find_package() спеціально шукає у файлах налаштувань CMake qqc2-desktop-style, тоді як ecm_find_qmlmodule() є менш суворою та шукає лише модуль QML. Остання вимагає включення ECMFindQmlModule:

include(ECMFindQmlModule)

Додавання піктограм

Перше, що потрібно зробити, щоб програма використовувала піктограми Breeze, це включити KIconThemes до вашого проєкту.

Після цього може виникнути потреба у додаванні декількох команд CMake для пакування піктограми вашої програми разом із програмою.

KIconThemes

Зробити це можна за допомогою таких трьох кроків:

  • Додавання її як залежності у Craft:
def setDependencies(self):
    self.runtimeDependencies["kde/frameworks/tier3/kiconthemes"] = None
  • Додавання її як залежності у CMake:
find_package(KF6 REQUIRED COMPONENTS IconThemes)

# ...

target_link_libraries(myapp
    PRIVATE
    # ...
    KF6::IconThemes
)
  • Використання її у коді C++, у файлі main.cpp:
#include <KIconTheme>

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

Зауважте, що хоча у назві проєкту та виклику CMake використано множину (KIconThemes, KF6IconThemes), виклик C++ використовує однину (KIconTheme).

KIconThemes має бути ініціалізовано до самої програми.

Піктограма програми

Якщо у вашої програми є піктограма, її слід додати до вашого проєкту як ресурс QML і як частину встановлення піктограм.

Зазвичай у Linux піктограму програми можна просто встановити у відповідний каталог, і, якщо потрібно, програма її отримає. Зазвичай піктограма програми складається з основної піктограми у форматі SVG, поєднаної з піктограмами у форматі PNG декількох розмірів.

Встановлення піктограми SVG виконується ось так у CMake:

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

А встановлення піктограм PNG виконується десь так:

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)

При встановленні піктограми у Linux, піктограма у форматі PNG, наприклад 48-apps-myapp.png, встановлюється до ${INSTALL_PREFIX}/share/icons/hicolor/48x48/apps/myapp.png, а піктограма SVG встановлюється до ${INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/org.kde.myapp.svg, де ${INSTALL_PREFIX} зазвичай є каталогом /usr, /usr/local або ~/.local. Зауважте, як у випадку PNG назва піктограми перетворюється на шлях, за яким її буде збережено у файловій системі.

Дізнатися більше про встановлення файлів можна з підручника Збирання програмного забезпечення KDE вручну: крок встановлення.

Після встановлення піктограми таким чином у коді QML її можна викликати просто за допомогою myapp або org.kde.myapp, як це було б з QIcon::fromTheme(). Цим можна скористатися у будь-якому елементі керування QML, який має властивість icon.name.

У Windows немає такого стандартного каталогу, і встановлення піктограми ні на що не вплине; піктограму слід включити до програми. Для цього файл PNG можна записати до власного каталогу встановлення за допомогою ecm_add_app_icon(), а файл PNG або SVG можна вбудувати в програму як файл ресурсів Qt за допомогою ecm_add_qml_module() або ecm_target_qml_sources().

Піктограма програми PNG встановлюється за допомогою такого коду:

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

А основну піктограму програми можна додати до пакета як ресурс Qt, ось так:

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

Це зробить піктограму програми доступною у формі ресурсу Qt у файлі qrc:/qt/qml/org/kde/myapp/org.kde.myapp.svg. Цим можна скористатися з будь-яким елементом керування QML, який має властивість icon.source.

Шлях RESOURCES залежить від місця зберігання піктограм. Традиційно для зберігання усіх піктограм створюють теку icons/ у кореневому каталозі проєкту, оскільки система не вважає їх справжніми файлами початкового коду.

Після встановлення піктограм (для Linux) та їхнього включення до комплекту (для Windows та Android) ви можете налаштувати їх у коді. У коді QML, для сумісності як з Windows, так і з Android, слід використовувати піктограму, яка входить до комплекту; у коді C++, зокрема під час налаштування піктограми вікна, можна використовувати типову піктограму теми, а піктограму, яка входить до комплекту, як резервний варіант за допомогою QIcon::fromTheme() у виклику QGuiApplication::setWindowIcon():

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

Піктограми Kirigami

Хоча у Windows немає стандартного каталогу для встановлення піктограм з теми піктограм, є можливість скомпонувати необхідні піктограми Breeze із вашою програмою Windows.

Це буде виконано Craft автоматично, якщо правильно налаштовано KIconThemes для проєкту, а значки Breeze включено як залежність до вашого проєкту.

Щодо налаштовування KIconThemes, див. розділ вище щодо KIconThemes.

Щоб додати піктограми Breeze як залежність для вашого проєкту, додайте цей код до вашого плану Craft:

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

Таким чином, вам не потрібно буде вручну додавати будь-які піктограми Breeze до вашої програми як ресурс: ви можете просто скористатися назвою QIcon::fromTheme(), такою як kde або application-exit-symbolic.

Збирання

Щоб зібрати вашу програму у Windows, скористайтеся підручником Збирання програм KDE у Windows за допомогою Craft: Збирання ваших власних проєктів у Windows.

Збирання у CI

Якщо проєкт належним чином налаштовано для збирання у Windows, і у ньому використано інфраструктуру KDE для розміщення коду (KDE Invent), можна налаштувати завдання Windows CI/CD.

Для цього вам потрібно буде додати відповідні шаблони CI для Windows за допомогою файла .gitlab-ci.yaml та перелічити ваші залежності у файлі .kde-ci.yaml, як зазначено у підручнику щодо Системи безперервної інтеграції.

Усування проблем

Якщо у вас виникли проблеми з адаптацією вашої програми до Windows, ви можете відвідати такі кімнати у Matrix: