Skip to main content
تخط المحتوى

فهم main.cpp

فهم الملف المركزي لرمز الخلفية لدينا

دور main.cpp

بينما يُستخدم QML للواجهة الأمامية لتطبيقات كيريغامي، تُكتب الواجهة الخلفية عادةً بلغة C++ بفضل سرعة هذه اللغة ومرونتها. بينما غطينا QML بعمق كبير في الصفحات السابقة، سنحتاج إلى فهم كود C++ للواجهة الخلفية لصنع تطبيقات أكثر فائدة مما يمكن تحقيقه باستخدام QML الخالص.

هنا، سنستعرض ملف main.cpp الذي أنشأناه في صفحة البدء لنفهم بشكل أفضل ما يحدث في ملف C++ المركزي لتطبيقنا. بينما هذا main.cpp أساسي، ستبقى الميزات التي سنستعرضها أساسية بغض النظر عن نوع التطبيق الذي تقرر إنشاءه.

ما يفعله

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include <QUrl>
#include <QQuickStyle>
#include <KLocalizedContext>
#include <KLocalizedString>
#include <KIconTheme>

int main(int argc, char *argv[])
{
    KIconTheme::initTheme();
    QApplication app(argc, argv);
    KLocalizedString::setApplicationDomain("tutorial");
    QApplication::setOrganizationName(QStringLiteral("KDE"));
    QApplication::setOrganizationDomain(QStringLiteral("kde.org"));
    QApplication::setApplicationName(QStringLiteral("Kirigami Tutorial"));
    QApplication::setDesktopFileName(QStringLiteral("org.kde.tutorial"));

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

    QQmlApplicationEngine engine;

    engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
    engine.loadFromModule("org.kde.tutorial", "Main");

    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    return app.exec();
}

أولاً، يجب تضمين عدد من ملفات الرأس الخاصة بكيوت، مما يسمح لنا باستخدام دوالها. في هذه الحالة، نضمّن عددًا من رؤوس كيوت التي تعالج منطق التطبيق، وتسمح لنا بقراءة ملفات QML.

ثم ننشئ مثيلاً لـ QApplication نسميه app. تمرير argc و argv إلى المنشئ مطلوب للاستدعاء.

نضبط أيضًا بعض البيانات الوصفية المتعلقة بالتطبيق. تتضمن هذه المنظمة التي أنشأت التطبيق، موقع المنظمة على الويب، واسم التطبيق. نضبط هذه الخصائص باستدعاء QApplication، وإنشاء كائن يأتي من QCoreApplication ويوفر حلقة الأحداث للتطبيقات بغض النظر عن وجود واجهة مستخدم رسومية أم لا (لذا إذا شغّلنا برنامجنا بدون الواجهة الرسومية، ستظل هذه البيانات الوصفية مضبوطة).

لجعل تطبيقنا يبدو جيدًا مع أيقونات Breeze ونمط Breeze في بيئات غير بلازما مثل ويندوز أو جنوم، نحتاج إلى فعل ثلاثة أشياء:

  • تهيئة مرافق التنسيق لـ KIconThemes على المنصات التي لا تكون فيها سمات الأيقونات جزءًا من النظام (مثل ويندوز أو ماك أو إس) باستخدام KIconTheme::initTheme()
  • ضبط QStyle باستخدام QApplication::setStyle() لفرض Breeze بدلاً من نمط المنصة الأصلي
  • ضبط نمط عناصر تحكم QtQuick باستخدام QQuickStyle::setStyle() لفرض Breeze مع qqc2-desktop-style الخاص بكيدي

يجب أن يتم استدعاء KIconTheme::initTheme() قبل إنشاء QApplication ويسمح للتطبيق بالعثور على أيقونات Breeze لاستخدامها. ضبط QStyle إلى Breeze ضروري لأننا استخدمنا QApplication لتطبيقنا بدلاً من QGuiApplication. عناصر التحكم الفعلية في النافذة مثل الأزرار ومربعات الاختيار ستتبع Breeze باستخدام qqc2-desktop-style.

يسمح لنا QQmlApplicationEngine بتحميل تطبيق من ملف QML، وهو ما نقوم به في السطر التالي. في engine.loadFromModule("org.kde.tutorial", "Main"); نقوم بتحميل QML الخاص بنا من استيراد URI المُعرَّف في CMake.

بعد ذلك، نتحقق مما إذا كان المحرك قد حمّل ملف QML بشكل صحيح عن طريق التحقق من أن قائمة rootObjects() للمحرك ليست فارغة. يمكننا بعد ذلك تشغيل تطبيقنا باستخدام app.exec().