Настройка для Windows
Введение
Qt хорошо поддерживает Windows, поэтому приложения, использующие Qt и extra-cmake-modules из KDE, не потребуют множества изменений для корректной работы в Windows.
Требуются три вещи:
Чертёж Craft требуется, чтобы объединить все зависимости вместе с приложением и создать исполняемый файл.
Директиву препроцессора #ifdef Q_OS_WIN можно использовать для написания кода, который будет применяться только при сборке приложения в Windows. Это необходимо как минимум один раз, чтобы принудительно применить к приложению стиль Breeze и оно хорошо выглядело в Windows, но в зависимости от приложения может потребоваться больше.
Включение в приложение необходимых значков для его работы в Windows — самый сложный этап, но и extra-cmake-modules (ECM) из KDE, и Qt предоставляют средства, упрощающие эту задачу.
Чертёж Craft
Чтобы начать, сначала необходимо выполнить инструкции из раздела Сборка программного обеспечения KDE в Windows с помощью Craft, чтобы получить работоспособную чертёж Craft и хотя бы собрать приложение в Windows.
Как только проект удастся собрать, появятся ошибки компиляции и времени выполнения, которые помогут устранить проблемы совместимости с Windows.
Стиль Breeze
Учебное руководство Kirigami уже должно быть в основном совместимо с Windows, но шаги для этого следует описать явно.
Чтобы обеспечить использование стиля Breeze, нужно внести два изменения: задать для QStyle значение breeze, а для стиля Qt Quick Controls — значение 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 только в Windows, где это наиболее актуально, с помощью 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.
Сборки в системе непрерывной интеграции
Если проект правильно настроен для сборки в Windows и использует инфраструктуру KDE для размещения кода (KDE Invent), можно настроить задания CI/CD для Windows.
Для этого потребуется добавить соответствующие шаблоны CI для Windows с помощью файла .gitlab-ci.yaml и перечислить зависимости в файле .kde-ci.yaml, как указано в разделе Система непрерывной интеграции.
Устранение неполадок
Если возникли проблемы с адаптацией приложения к Windows, можно посетить следующие комнаты в Matrix: