Настройка проекта на Rust
Установка Kirigami
Прежде чем начать, необходимо установить Kirigami и Rust на компьютере.
sudo pacman -S cargo cmake extra-cmake-modules kirigami breeze qqc2-desktop-style | |
sudo zypper install cargo cmake kf6-extra-cmake-modules kf6-kirigami-devel qt6-quickcontrols2-devel kf6-qqc2-desktop-style-devel | |
sudo dnf install cargo cmake extra-cmake-modules kf6-kirigami-devel kf6-qqc2-desktop-style |
Дополнительные сведения для других дистрибутивов можно найти в разделе Установка зависимостей для сборки.
Структура проекта
Сначала создаётся папка проекта (можно использовать приведённые ниже команды). Папка будет называться kirigami_rust/. Структура проекта будет такой:
kirigami_rust/
├── CMakeLists.txt
├── Cargo.toml
├── build.rs
├── org.kde.kirigami_rust.desktop
└── src/
├── main.rs
└── qml/
└── Main.qmlВ этом проекте CMake будет использоваться для вызова Cargo, который, в свою очередь, соберёт проект.
О CMake и Cargo
Это не традиционный способ сборки проекта на Rust: технически для его сборки требуется только Cargo, обычно с помощью cargo build и cargo run.
Однако для установки приложений для рабочего стола требуется CMake (или его аналог, например Meson, используемый в GNOME, или Just, используемый в COSMIC), поскольку в Cargo отсутствуют возможности, нужные для установки графических приложений для рабочего стола.
Проект будет называться kirigami_rust и создаст исполняемый файл с именем kirigami_hello.
💡 Совет
Эту структуру файлов можно быстро создать с помощью команды:mkdir -p kirigami_rust/src/qml/.org.kde.kirigami_rust.desktop
Основное назначение файлов .desktop — показывать приложение в меню запуска приложений в Linux. Ещё одна причина их использовать — значки окон в Wayland, поскольку они нужны, чтобы сообщить композитору: «это окно соответствует этому значку».
Оно должно соответствовать схеме обратного именования DNS, за которой следует расширение .desktop, например org.kde.kirigami_rust.desktop:
| |
CMakeLists.txt
Файл CMakeLists.txt будет использоваться для запуска Cargo и установки необходимых файлов вместе с приложением. Он также предоставляет ряд удобных возможностей, например гарантирует установку Kirigami во время сборки и указывает дистрибутивам Linux установить необходимые зависимости вместе с приложением.
| |
Первым делом в проект добавляется Extra CMake Modules (ECM) из KDE, чтобы можно было использовать ecm_find_qml_module для проверки наличия Kirigami при попытке сборки приложения, а если его нет — немедленно прервать сборку. Ещё одна полезная возможность ECM — ECMUninstallTarget, позволяющая при желании легко удалить приложение средствами CMake.
Также используется find_package() из CMake, чтобы убедиться в наличии qqc2-desktop-style — стиля QML KDE для рабочего стола. Это одна из двух причин использования CMake в этом руководстве.
Проекты на Rust обычно собираются с помощью Cargo, и здесь будет так же. Создаётся цель, которая при выполнении просто запускает Cargo, и помечается меткой ALL, чтобы она собиралась по умолчанию. Cargo соберёт исполняемый файл в папке сборки CMake (обычно build/).
Подробнее о CMake, целях и папке сборки можно прочитать в разделе Сборка программного обеспечения KDE вручную.
После этого остаётся лишь установить исполняемый файл kirigami_rust, созданный Cargo в папке сборки, в BINDIR, который обычно указывает на /usr/bin, /usr/local/bin или ~/.local/bin. Кроме того, в APPDIR, обычно /usr/share/applications или ~/.local/share/applications, устанавливается требуемый файл .desktop. Это вторая причина использования CMake в этом руководстве.
Дополнительные сведения о том, куда устанавливается программное обеспечение KDE, можно найти в разделе Сборка программного обеспечения KDE вручную: шаг установки.
Теперь, когда с CMake разобрались, рассмотрим файлы, с которыми предстоит работать большую часть времени.
Cargo.toml
Далее приведён очень простой Cargo.toml:
| |
Он состоит из метаданных проекта и списка зависимостей, которые Cargo загрузит автоматически, а именно cxx и cxx-qt, необходимых для запуска приложений Qt, написанных на Rust.
build.rs
Если в C++ элементы QML обычно регистрируются с помощью QML_ELEMENT и ecm_add_qml_module с использованием декларативной регистрации, то в Rust его потребуется объявить в файле сценария сборки build.rs:
| |
Это необходимо, чтобы файл QML был доступен в точке входа приложения main.rs.
src/main.rs
Файл kirigami_rust/src/main.rs инициализирует проект, а затем загружает файл QML, который будет представлять собой пользовательский интерфейс приложения.
| |
Первая часть, помеченная макросом Rust #[cxx_qt::bridge], просто создаёт фиктивный QObject из фиктивной структуры Rust. Это нужно лишь для того, чтобы завершить использование QmlModule в предыдущем сценарии сборки build.rs. В будущем уроке, посвящённом тому, как сделать код Rust доступным для QML, ей будет отведена более важная роль, но пока её можно игнорировать.
После этого начинается важная часть:
Строки 12–13 импортируют необходимые библиотеки Qt, предоставляемые через cxx-qt.
Сначала создаётся новый экземпляр QApplication, затем в строках 20–26 выполняются несколько интеграций.
Затем идёт часть, которая непосредственно создаёт окно приложения:
| |
Длинный URL qrc:/qt/qml/org/kde/tutorial/src/qml/Main.qml соответствует файлу Main.qml согласно системе ресурсов Qt и следует схеме: <resource_prefix><import_URI><QML_dir><file>.
Иными словами: префикс ресурса по умолчанию qrc:/qt/qml/ + URI импорта org/kde/tutorial (задан в build.rs, разделён косыми чертами вместо точек) + папка QML src/qml/ + файл QML Main.qml.
src/qml/Main.qml
| |
Здесь мы займёмся фронтендом приложения.
Тем, кто знаком с JavaScript, многое в QML покажется знакомым (хотя у него есть свои особенности). В документации Qt содержится обширный материал по этому языку, если возникнет желание попробовать что-то самостоятельно. В этих уроках основное внимание будет уделено коду QML, где с помощью Kirigami можно извлечь из него максимум.
Пока сосредоточимся на Main.qml. Сначала импортируем несколько важных модулей:
- QtQuick — стандартная библиотека, используемая в приложениях QML.
- QtQuick Controls предоставляет ряд стандартных элементов управления, которые можно использовать, чтобы сделать приложения интерактивными.
- QtQuick Layouts, который предоставляет средства для размещения компонентов в окне приложения.
- Kirigami, предоставляющий набор компонентов, подходящих для создания приложений, работающих на устройствах разных форм и размеров.
Примечание
Размещение импортов QtQuick Controls и Kirigami в отдельных пространствах имён с помощью ключевого словаas — рекомендуемая практика, гарантирующая, что компоненты с одинаковыми именами не будут конфликтовать. В разных источниках можно встретить другие имена для QtQuick Controls, например «QQC» или «QQC2». В этом руководстве для ясности будет использоваться «Controls».Далее следует базовый элемент — Kirigami.ApplicationWindow, который предоставляет ряд основных возможностей, необходимых всем приложениям Kirigami. Это окно, в котором будут размещаться все страницы — основные разделы пользовательского интерфейса.
Затем свойству id окна присваивается значение «root». Идентификаторы полезны, поскольку позволяют однозначно ссылаться на компонент, даже если имеется несколько компонентов одного типа.
Также свойству title окна присваивается значение «Hello World».
Затем задаётся первая страница стека страниц. Большинство приложений Kirigami организованы в виде стека страниц, каждая из которых содержит связанные компоненты, подходящие для конкретной задачи. Пока всё делается просто, и используется только одна страница. pageStack — это изначально пустой стек страниц, предоставляемый Kirigami.ApplicationWindow, а с помощью pageStack.initialPage: Kirigami.Page {...} первая страница, показываемая при загрузке приложения, задаётся как Kirigami.Page. Эта страница будет содержать всё содержимое.
Наконец, на страницу добавляется Controls.Label, позволяющий разместить текст. Чтобы выровнять надпись по центру по горизонтали и вертикали внутри родительского элемента, используется anchors.centerIn: parent. В этом случае родительским компонентом надписи является Kirigami.Page. Последнее, что нужно сделать, — задать её текст: text: "Hello World!".
Сборка и установка приложения
Созданный исполняемый файл kirigami_hello должен находиться в build/debug/kirigami_hello. Его можно запустить напрямую или с помощью cargo run, но у него не будет значка окна. Чтобы исправить это, сначала устанавливается приложение.
Выполните следующее:
cmake -B build --install-prefix ~/.local
cmake --build build/
cmake --install build/С помощью первой команды CMake выполнит поиск Kirigami и qqc2-desktop-style.
С помощью второй команды CMake соберёт цель kirigami_rust, которая просто вызывает cargo build --target-dir build/. Этот шаг займёт некоторое время, но при следующем выполнении второй команды CMake сборка пройдёт быстрее или компилировать вообще не потребуется.
На третьем шаге CMake установит исполняемый файл kirigami_hello в ~/.local/bin/kirigami_hello и файл .desktop в ~/.local/share/applications, а в меню появится новый пункт «Kirigami Tutorial in Rust».
Откройте пункт меню — и готово! Теперь перед глазами появится самое первое приложение Kirigami.

Чтобы запустить новое приложение QML в мобильном режиме, можно использовать QT_QUICK_CONTROLS_MOBILE=1:
QT_QUICK_CONTROLS_MOBILE=1 kirigami_helloЕсли проект был собран вручную с помощью CMake и по какой-то причине его требуется удалить, можно выполнить:
cmake --build build/ --target uninstall