الإعداد مع Rust
تنصيب كيريغامي
قبل البدء، سنحتاج إلى تثبيت كيريغامي و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-kirigami2-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
الغرض الأساسي من ملفات إدخال سطح المكتب هو عرض تطبيقك على مشغل التطبيقات في لينكس. سبب آخر لامتلاكها هو الحصول على أيقونات النوافذ على Wayland، حيث إنها مطلوبة لإخبار المُركِّب "هذه النافذة تذهب مع هذه الأيقونة".
يجب أن يتبع نظام تسمية DNS عكسي متبوعًا بالامتداد .desktop مثل org.kde.kirigami_rust.desktop:
| |
CMakeLists.txt
سيُستخدم ملف CMakeLists.txt لتشغيل Cargo ولتثبيت الملفات الضرورية مع تطبيقنا. كما يوفر ميزات معينة لتحسين جودة الحياة، مثل التأكد من تثبيت كيريغامي أثناء التجميع ولإشارة توزيعات لينكس إلى تثبيت التبعيات الضرورية مع التطبيق.
| |
أول شيء نفعله هو إضافة وحدات CMake الإضافية من كيدي (ECM) إلى مشروعنا حتى نتمكن من استخدام ecm_find_qml_module للتحقق من تثبيت كيريغامي عند محاولة بناء التطبيق، وإذا لم يكن مثبتًا، نفشل فورًا. ميزة أخرى مفيدة في ECM هي ECMUninstallTarget، والتي تسمح بإلغاء تثبيت التطبيق بسهولة باستخدام CMake إذا رغبت.
نستخدم أيضًا find_package() من CMake للتأكد من وجود qqc2-desktop-style، نمط QML لسطح المكتب من كيدي. هذا أحد السببين لاستخدامنا CMake في هذا الدليل.
عادةً تُبنى مشاريع Rust باستخدام Cargo، ولن يختلف الأمر هنا. ننشئ هدفًا سيشغّل Cargo ببساطة عند تشغيله، ونعلّمه بـ ALL ليُبنى افتراضيًا. سيبني Cargo الملف القابل للتنفيذ داخل دليل CMake الثنائي (عادةً build/).
لمزيد من المعلومات حول CMake والأهداف ودليل الثنائيات، راجع بناء برمجيات كيدي يدويًا.
بعد ذلك، نُثبّت ببساطة الملف التنفيذي kirigami_rust الذي يولّده Cargo في دليل الثنائيات ونُثبّته في BINDIR، وهو عادةً /usr/bin أو /usr/local/bin أو ~/.local/bin. ونُثبّت أيضًا ملف سطح المكتب الضروري في APPDIR، وهو عادةً /usr/share/applications أو ~/.local/share/applications. وهذا هو السبب الثاني لاستخدامنا CMake في هذا الدليل.
لمزيد من المعلومات حول مكان تثبيت برمجيات كيدي، راجع بناء برمجيات كيدي يدويًا: خطوة التثبيت.
والآن بعد أن عُولج أمر 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، ويتبع هذا المخطط: <بادئة_المورد><URI_الاستيراد><دليل_QML><ملف>.
بعبارة أخرى: بادئة المورد المبدئية 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 وملف سطح المكتب تحت ~/.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