Connectar la lògica amb la vostra interfície d'usuari en QML
Connectant un dorsal per a fer càlculs i proporcionar dades per a mostrar a la vostra interfície d'usuari
Per a integrar la lògica dins de l'aplicació, necessitem que les classes del dorsal estiguin en C++ perquè puguin fer els càlculs importants. Es desaconsella escriure la lògica en els fitxers QML, així que intenteu moure tant com sigui possible cap al dorsal, de manera que el QML s'empri exclusivament per a mostrar la interfície d'usuari.
Farem servir el codi de la guia d'aprenentatge [Usar fitxers separats en un projecte C++](/content/docs/getting-started/kirigami/introduction- separatefiles) com a base.
Primer, creeu el fitxer de capçalera que tindrà el codi exposat al QML, és a dir, el tipus 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);};
Hi ha dues coses necessàries per a exposar el codi C++ al QML, i una d'elles és simplement utilitzar la macro QML_ELEMENT, disponible a la capçalera <QtQml/qqmlregistration.h>.
El dorsal es crearà com a «singleton», el que significa que només es crearà una vegada i existirà durant tota la durada de l'aplicació. Per això, fem servir la macro QML_SINGLETON.
src/components/backend.cpp
Podem afegir el nostre codi inicial per al constructor a backend.cpp:
A partir d'ara, el dorsal serà conegut pel QML com el tipus QML Backend. Està contingut en un mòdul anomenat org.kde.tutorial.components.
Això significa que només afegint la importació en un fitxer QML, és possible utilitzar el codi exposat des de C++:
importorg.kde.tutorial.components
Per a començar des de zero utilitzant el codi d'aplicació existent, creeu un component QML nou que contingui una pàgina buida:
1
2
3
4
5
6
7
importorg.kde.kirigamiasKirigamiimportorg.kde.tutorial.componentsKirigami.Page{title:"Exposing to QML Tutorial"// ...
}
src/Main.qml
Per a mostrar realment la pàgina nova, crearem una opció de menú que enviï la pàgina nova a l'aplicació, només perquè puguem provar el model amb més facilitat.
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
Finalment, afegim els backend.h, backend.cpp i ExposePage.qml creats nous al CMake:
Ara hem connectat la classe que conté la lògica futura amb l'aplicació, però encara no fa res. Per a canviar això, afegirem una propietat a la classe. Les propietats són molt més que una simple variable. Poden informar a la interfície d'usuari sobre els canvis perquè pugui actualitzar les àrees correctes.
Just a sota de la macro QML_SINGLETON, afegim una [Q_PROPERTY](docs:qtcore; QObject::Q_PROPERTY) nova.
Això sembla molt codi per a només llegir i escriure codi des del dorsal. Però una mirada més atenta revela que llegir la propietat des de la IU pot executar una lògica, i el mateix quan s'escriu. En aquest cas, informarà automàticament el frontal i el dorsal dels canvis.
La lectura i escriptura es basen en les funcions capturadora i establidora. Continueu i afegiu un atribut privat nou a la vostra classe que contingui les dades, així com les funcions capturadora i establidora rellevants.
La primera funció és la capturadora, la segona l'establidora i la tercera un senyal que s'emet quan es canvia la propietat. Coincideixen amb les parts READ, WRITE i NOTIFY de la Q_PROPERTY d'abans.
El resultat hauria de ser el següent:
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
El senyal no necessita cap implementació en el fitxer backend.cpp, ja que no fa gaire més que ser emès, però la capturadora i l'establidora s'han d'implementar de manera similar a la següent:
Com podeu veure, quan es crida al configurador, s'emetrà el senyal i informarà la interfície d'usuari i al dorsal del canvi.
src/components/ExposePage.qml
Per a mostrar el text, afegiu una Kirigami.Heading a src/components/ExposePage.qml sota la propietat title del component Kirigami.Page que hem afegit al codi.
El codi resultant en aquesta part del fitxer s'hauria de veure així:
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}}
Ara compileu i torneu a iniciar el programa. Veureu que la pàgina nova té un encapçalament centrat dient «Hola món!».