اربط خلفية لإجراء الحسابات وتزويد واجهة المستخدم الخاصة بك ببيانات لعرضها
لدمج المنطق في التطبيق، نحتاج إلى أصناف خلفية C++ يمكنها إجراء الحسابات المهمة. لا يُشجَّع كتابة المنطق في ملفات QML، لذا حاول نقل أكبر قدر ممكن إلى الخلفية بحيث يُستخدم QML فقط لعرض واجهة المستخدم.
أولًا، أنشئ ملف الرأس الذي سيحتوي على شيفرة مُعرَّضة لـ QML، أي نوع Backend:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
#include<QObject>#include<qqmlintegration.h>classBackend:publicQObject{Q_OBJECTQML_ELEMENTQML_SINGLETONpublic:explicitBackend(QObject*parent=nullptr);};
هناك شيئان مطلوبان لعرض شيفرة C++ لـ QML، وأحدهما هو ببساطة استخدام كلية QML_ELEMENT، المتوفرة في ملف الرأس <QtQml/qqmlregistration.h>.
سيُأنشأ الخلفية كمفردة، مما يعني أنها ستُنشأ مرة واحدة فقط وتوجد طوال مدة عمر التطبيق. لهذا، نستخدم كلية QML_SINGLETON.
src/components/backend.cpp
يمكننا إضافة شيفرتنا الأولية للباني إلى backend.cpp:
globalDrawer:Kirigami.GlobalDrawer{isMenu:trueactions:[Kirigami.Action{text:i18n("Exposing to QML")icon.name:"kde"onTriggered:pageStack.push(Qt.createComponent("org.kde.tutorial.components","ExposePage"))},Kirigami.Action{text:i18n("Quit")icon.name:"application-exit-symbolic"shortcut:StandardKey.QuitonTriggered:Qt.quit()}]}
src/components/CMakeLists.txt
أخيرًا، أضف backend.h و backend.cpp و ExposePage.qml المُنشأة حديثًا إلى CMake:
الآن وصلنا الصف الذي يحمل المنطق المستقبلي بالتطبيق، لكنه لا يفعل شيئًا بعد. لتغيير ذلك، لنضف خاصية إلى الصف. الخصائص هي أكثر بكثير من مجرد متغير بسيط. يمكنها إعلام واجهة المستخدم بالتغييرات لتتمكن من تحديث المناطق الصحيحة.
قد يبدو هذا ككثير من الكود لمجرد قراءة وكتابة بعض الكود من الخلفية. لكن نظرة أقرب تكشف أن قراءة الخاصية من واجهة المستخدم يمكنها بالفعل تشغيل بعض المنطق—وكذلك عند الكتابة إليها. في هذه الحالة، ستُعلم تلقائيًا الواجهة الأمامية والخلفية بالتغييرات.
القراءة والكتابة تستندان إلى مفهوم دوال الجلب والضبط. تفضل وأضف سمة خاصة جديدة إلى صفك تحمل البيانات، بالإضافة إلى دوال الجلب والضبط ذات الصلة.
الدالة الأولى هي الجالب، والثانية الضابط، والثالثة إشارة تُبعث عندما تُغير الخاصية. تتطابق مع أجزاء READ و WRITE و NOTIFY من Q_PROPERTY أعلاه.
النتيجة ينبغي أن تبدو كما يلي:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#include<QObject>#include<qqmlintegration.h>classBackend:publicQObject{Q_OBJECTQML_ELEMENTQML_SINGLETONQ_PROPERTY(QStringintroductionTextREADintroductionTextWRITEsetIntroductionTextNOTIFYintroductionTextChanged)public:explicitBackend(QObject*parent=nullptr);QStringintroductionText()const;voidsetIntroductionText(constQString&introductionText);Q_SIGNALvoidintroductionTextChanged();private:QStringm_introductionText=QStringLiteral("Hello World!");};
src/components/backend.cpp
الإشارة لا تحتاج أي تنفيذ في ملف backend.cpp، حيث أنها لا تفعل أكثر من البعث، لكن الجالب والضابط يحتاجان إلى تنفيذ مشابه لما يلي:
الكود الناتج في ذلك الجزء من الملف ينبغي أن يبدو هكذا:
1
2
3
4
5
6
7
8
9
10
importorg.kde.kirigamiasKirigamiimportorg.kde.tutorial.componentsKirigami.Page{title:"Exposing to QML Tutorial"Kirigami.Heading{anchors.centerIn:parenttext:Backend.introductionText}}
#pragma once
#include<QObject>#include<qqmlintegration.h>classBackend:publicQObject{Q_OBJECTQML_ELEMENTQML_SINGLETONQ_PROPERTY(QStringintroductionTextREADintroductionTextWRITEsetIntroductionTextNOTIFYintroductionTextChanged)public:explicitBackend(QObject*parent=nullptr);QStringintroductionText()const;voidsetIntroductionText(constQString&introductionText);Q_SIGNALvoidintroductionTextChanged();private:QStringm_introductionText=QStringLiteral("Hello World!");};
importorg.kde.kirigamiasKirigamiimportorg.kde.tutorial.componentsKirigami.Page{title:"Exposing to QML Tutorial"Kirigami.Heading{anchors.centerIn:parenttext:Backend.introductionText}}
الآن ترجم وابدأ برنامجك مرة أخرى. سترى أن الصفحة الجديدة تحتوي على عنوان وسطي يقول "مرحبًا بالعالم!".
تهانينا، تعلمت:
كيف تسجل أنواع الخلفية إلى QML
أضف عناصر جديدة إلى ملف QML
أنشئ صفوفًا فرعية جديدة من QObject
كيف تضيف خصائص وماذا تفعل
ما هي الإشارات
إذا أردت معرفة المزيد عن التكامل بين QML و C++، نوصي بقراءة وثائق Qt الرسمية.