Een backend verbinden om berekeningen te doen en uw gebruikersinterface te leveren met te tonen gegevens
Om logica in de toepassing te integreren, hebben we C++ backend-classes nodig die de belangrijke berekeningen kan doen. Logica schrijven in de QML-bestanden wordt ontraden, probeer het dus zoveel als mogelijk naar de backend te verplaatsen, zodat QML alleen wordt gebruikt voor het tonen van de gebruikersinterface.
Maak eerst het header-bestand dat code zal hebben blootgesteld aan QML, namelijk het type 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);};
Er zijn twee dingen nodig om C++ code bloot te stellen aan QML, en een ervan is eenvoudig de macro QML_ELEMENT gebruiken, beschikbaar in de header <QtQml/qqmlregistration.h>.
De backend wordt als singleton aangemaakt, wat betekent dat deze slechts één keer wordt aangemaakt en gedurende de hele levensduur van de toepassing blijft bestaan. Hiervoor gebruiken we de macro QML_SINGLETON.
src/components/backend.cpp
We kunnen onze eerste code voor de constructor toevoegen aan backend.cpp:
Vanaf nu zal de backend in QML bekendstaan als het QML-type Backend. Deze is opgenomen in een module genaamd org.kde.tutorial.components.
Dit betekent dat het mogelijk is om, door simpelweg de import in een QML-bestand toe te voegen, de code te gebruiken die vanuit C++ beschikbaar is:
importorg.kde.tutorial.components
Om helemaal opnieuw te beginnen met de bestaande toepassingscode, maakt u een nieuwe QML-component aan die een lege pagina bevat:
1
2
3
4
5
6
7
importorg.kde.kirigamiasKirigamiimportorg.kde.tutorial.componentsKirigami.Page{title:"Exposing to QML Tutorial"// ...
}
src/Main.qml
Om de nieuwe pagina daadwerkelijk weer te geven, maken we een menuoptie die de nieuwe pagina naar de applicatie pusht, zodat we het model gemakkelijker kunnen testen.
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
Voeg tot slot de zojuist aangemaakte backend.h, backend.cpp en ExposePage.qml toe aan CMake:
We hebben nu de klasse die de toekomstige logica bevat van de toepassing, maar het doet nog steeds niets. Om dat te wijzigen, voegen we een eigenschap toe aan de klasse. Eigenschappen zijn heel wat meer dan een eenvoudige variabele. Ze kunnen ed UI informeren over wijzigingen, dus kan het de juiste gebieden bijwerken.
Direct onder de macro QML_SINGLETON, voeg een nieuwe Q_PROPERTY.
Dit lijkt misschien heel wat code om enige code uit de backend te lezen. Maar een nadere beschouwing laat zien dat lezen van de eigenschap uit de UI al enige logic-same kan uitvoeren wanneer er naar geschreven is. In dat geval zal automatisch de frontend en backend informeren over wijzigingen.
Het lezen en schrijven is gebaseerd op het concept van getter en setter-functies. Ga verder en voeg een nieuw privé attribuut toe aan uw klasse die de gegevens bevat, evenals de relevante getter en setter-functies.
Voeg een nieuwe private sectie toe met het volgende:
De eerste functie is de getter, de tweede de setter en de derde een signaal dat wordt uitgezonden wanneer de eigenschap is gewijzigd. Ze komen overeen met de delen READ, WRITE en NOTIFY van de bovenstaande Q_PROPERTY.
Het resultaat zou zou er uit moeten zien als volgt:
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
Het signaal behoeft geen enkele implementatie in het bestand backend.cpp, omdat het niet veel meer doet dan uitgezonden worden, maar de getter en setter moeten geïmplementeerd worden lijkend op het volgende:
Zoals u kunt zien, wanneer de setter wordt aangeroepen, zal het signaal worden uitgezonden en wordt de ui (gebruikersinterface) en de backend van de wijziging geïnformeerd.
src/components/ExposePage.qml
Om de tekst te tonen, voeg een eigenschap Kirigami.Heading toe aan src/components/ExposePage.qml onder de titel van de component Kirigami.Page die we aan de code hebben toegevoegd.
De resulterende code in dat gedeelte van het bestand zou er uit moeten zien als dit:
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}}
Compileer nu het bestand en start uw programma opnieuw. U zult zien dat de nieuwe pagina een gecentreerde koptekst heeft met de tekst "Hallo wereld!".
Gefeliciteerd, u hebt geleerd:
Hoe backend-typen to QML te registreren
Nieuwe elementen aan het QML-bestand toevoegen
Nieuwe QObject-subklassen aanmaken
Hoe eigenschappen toe te voegen en wat ze doen
Wat signalen zijn
Als u meer wilt weten over de integratie tussen QML en C++, dan bevelen we het lezen van de officiële Qt documentatie aan.