Povežite logiko s svojim uporabniškim vmesnikom QML
Povežite zaledje za opravljanje izračunov in oskrbovanje uporabniškega vmesnika s podatki za prikaz
Za integracijo logike v aplikacijo potrebujemo razrede zalednega sistema C++, ki lahko izvajajo pomembne izračune. Pisanje logike v datoteke QML ni priporočljivo, zato poskusite čim več logike premakniti v zaledni sistem, tako da se QML uporablja samo za prikaz uporabniškega vmesnika.
Najprej ustvarite datoteko glave, ki bo vsebovala kodo, izpostavljeno QML, in sicer zvrsti 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);};
Za izpostavljanje kode C++ v QML sta potrebni dve stvari, ena od njiju pa je preprosta uporaba makra QML_ELEMENT, ki je na voljo v glavi <QtQml/qqmlregistration.h>.
Zaledni del bo ustvarjen kot singleton, kar pomeni, da bo ustvarjen samo enkrat in bo obstajal celotno življenjsko dobo aplikacije. Za to uporabljamo makro QML_SINGLETON.
src/components/backend.cpp
Začetno kodo za konstruktor lahko dodamo v 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
Nazadnje v CMake dodajte novo ustvarjene datoteke backend.h, backend.cpp in ExposePage.qml:
Zdaj smo razred, ki drži bodočo logiko, povezali z aplikacijo, a še vedno ne naredi ničesar. Če želite to spremeniti, dodajmo lastnost razredu. Lastnosti so veliko več kot preprosta spremenljivka. Uporabniški vmesnik lahko obvestijo o spremembah, tako da lahko posodobijo prava področja.
Tik pod makrom QML_SINGLETON dodajte novo lastnost Q_PROPERTY.
To se morda zdi veliko kode, samo za to da preberete in napišete nekaj kode iz zaledja. Vendar natančnejši pogled razkriva, da branje lastnosti iz uporabniškega vmesnika že lahko zažene nekaj logike - in enako, kadar je zapisujemo. V tem primeru bo samodejno obvestilo začelje in zaledje o spremembah.
Branje in pisanje temeljita na funkcijah getter in setter. Nadaljujte in dodajte nov zasebni atribut vašemu razredu, kot je ta, in dodajte funkciji getter in setter.
Prva funkcija je getter, druga setter, tretja pa signal, ki se odda ob spremembi lastnosti. Ujemajo se z deli READ, WRITE in NOTIFY zgornje funkcije Q_PROPERTY.
Rezultat bi moral biti podoben naslednjemu:
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
Signal ne potrebuje nobene implementacije v datoteki backend.cpp, saj ne naredi veliko več kot le oddajanje, vendar je treba metode za pridobivanje in nastavljanje implementirati podobno kot sledi:
Kot vidite, bo ob klicu setterja oddan signal oddan, ki bo obvestil uporabniški vmesnik in zaledje o spremembi.
src/components/ExposePage.qml
Za prikaz besedila dodajte Kirigami.Heading v src/components/ExposePage.qml pod lastnostjo title komponente Kirigami.Page, ki smo jo dodali v kodo.
Nastala koda v tem delu datoteke mora biti videti tako:
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}}
Sedaj prevedite in znova zaženite program. Videli boste, da ima nova stran osrednji naslov z napisom "Hello World!".