Prepojte logiku s vaším používateľským rozhraním QML
Prepojte backend na vykonávanie výpočtov a zásobovanie vášho používateľského rozhrania dátami na zobrazenie
Na integráciu logiky do aplikácie potrebujeme backendové triedy C++, ktoré dokážu vykonávať dôležité výpočty. Písanie logiky v súboroch QML sa neodporúča, preto sa pokúste presunúť čo najviac do backendu, aby sa QML používal iba na zobrazovanie používateľského rozhrania.
Najskôr vytvorte hlavičkový súbor, ktorý bude mať kód vystavený do QML, konkrétne typ 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);};
Na sprístupnenie kódu C++ pre QML sú potrebné dve veci a jednou z nich je jednoduché použitie makra QML_ELEMENT, dostupného v hlavičkovom súbore <QtQml/qqmlregistration.h>.
Backend bude vytvorený ako singleton, čo znamená, že bude vytvorený iba raz a bude existovať po celú dobu životnosti aplikácie. Na to používame makro QML_SINGLETON.
CMakeLists
Do backend.cpp môžeme pridať náš počiatočný kód pre konštruktor:
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()}]}
CMakeLists
Nakoniec pridajte novo vytvorené backend.h, backend.cpp a ExposePage.qml do CMake:
Teraz sme pripojili triedu obsahujúcu budúcu logiku k aplikácii, ale stále nič nerobí. Aby sme to zmenili, pridajme do triedy vlastnosť. Vlastnosti sú oveľa viac než jednoduchá premenná. Môžu informovať UI o zmenách, aby mohlo aktualizovať správne oblasti.
Priamo pod makrom QML_SINGLETON pridajte novú Q_PROPERTY.
Toto sa môže zdať ako veľa kódu len na čítanie a zápis z backendu. Avšak bližší pohľad odhalí, že čítanie vlastnosti z UI už môže spúšťať nejakú logiku—rovnako keď sa do nej zapisuje. V tomto prípade automaticky informuje frontend aj backend o zmenách.
Čítanie a zápis je založený na koncepte funkcií getter a setter. Pokračujte a pridajte do vašej triedy nový privátny atribút, ktorý drží dáta, ako aj príslušné funkcie getter a setter.
Prvá funkcia je getter, druhá setter a tretia je signál, ktorý je emitovaný pri zmene vlastnosti. Zodpovedajú častiam READ, WRITE a NOTIFY vyššie uvedeného Q_PROPERTY.
Výsledok by mal vyzerať nasledovne:
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!");};
CMakeLists
Signál nepotrebuje žiadnu implementáciu v súbore backend.cpp, pretože nerobí oveľa viac než to, že je emitovaný, ale getter a setter musia byť implementované podobne ako nasledovné:
Ako vidíte, keď sa zavolá setter, signál bude emitovaný a informuje UI a backend o zmene.
CMakeLists
Na zobrazenie textu pridajte Kirigami.Heading do src/components/ExposePage.qml pod vlastnosť title komponentu Kirigami.Page, ktorý sme pridali do kódu.
Výsledný kód v tejto časti súboru by mal vyzerať takto:
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}}
Teraz skompilujte a znova spustite váš program. Uvidíte, že nová stránka má vycentrovaný nadpis s textom "Hello World!".