Gabe’s Geek Log (Glog)

Gabe’s Geek Log (Glog)

Eventyr i bin r.

QtQuick: QML-til-C + + Link.

Sist gang vi satt opp en QML stillas for en Kalkulator-brukergrensesnitt. Toppniva-brukergrensesnittet oppretter folgende signaler og spor for a kommunisere med Kalkulator-motoren:

data (strengval) & # 8211; (Brukergrensesnitt til motor) kommuniserer hvilken knapp som er presset contentChanged (string val) & # 8211; (Motor til brukergrensesnitt) indikerer at displayteksten er endret.

Sa, var soknad skal bygges slik:

Vis & # 8211; QML-brukergrensesnittmodellen & # 8211; Kalkulatoren Motor hoved () & # 8211; Dette vil lim alt sammen.

Motorklassen.

Med det formal a kommunisere med QML brukergrensesnittet & # 8230; Hovedinnholdet i klassen Engine er:

Alt annet er bare implementering av logikken. Nar brukeren trykker pa en knapp, blir den kommunisert til motoren via tastetrykk (QString) -sporet. Nar motoren bestemmer at displayet pa brukergrensesnittet skal endres, kommuniserer det det med content_changed (QString) -signalet.

Se lenken pa slutten for full implementering, men kalkulatoren er implementert som en statlig maskin. Den gjeldende operasjonen er den nav rende tilstanden (eller & # 8220; modus & # 8221;). Det endrer atferd basert pa gjeldende modus og hvorvidt modusen nylig er endret. Men siden fokus er C ++ / QML interaksjon & # 8230; Vi vant ikke a ga inn i motorens detaljer.

main (): Foreta tilkoblinger.

For a limme sammen motoren og brukergrensesnittet, ma vi sette opp ting i hovedfunksjonen ():

Dette oppretter bare en motor, setter opp QML View (QDeclarativeView), og setter deretter opp signaler og spor.

Tilkoblinger til QML-brukergrensesnittet er ikke laget med QDeclarativeView, men med QDeclarativeView :: rootObject () (som har typen QGraphicsView). Pa grunn av QGraphicsView-objektet ma du inkludere & lt; QGraphicsView & gt; header, [1] ellers vil kompilatoren gi deg merkelige feil om casting. Lukk () -sporet er imidlertid i QDeclarativeView. I dette tilfellet kobler vi QML-brukergrensesnittet til sin QDeclarativeView-container.

QML-endringer.

Pa QML-siden av ting, er det noen fa endringer som er nodvendige for a fa ballen til a rulle.

Fjern stillas: Det som vi merket som & # 8220; DETTE ER TIDLIGT & # 8221; siste gang ma fjernes siden vi har en bona fide motor, na. Knappendringer: Var implementering forrige gang hadde egentlig ikke nok knapper til a v re enkle a legge til bare & # 8221; kalkulator. Vi har lagt til flere knapper og omorganisert dem. Tastaturakselatorer: Med taper av ting som QAction, hva gjor vi for touch-typing-junkies som meg?

De to forste (stillas og knapper) er ganske enkelt:

Vi har bare slettet noen ting, lagt til de ekstra knappene, og koblet til de interne signal- / sporforbindelsene. Faktisk vil disse endringene alene gi deg en fin, fungerende kalkulator.

Men stotte for tastetrykksinngang er viktig for folk som meg. Det er en grunn til at jeg virkelig savner QAction. Imidlertid er det ikke veldig vanskelig a legge til stotte for tastetrykk i kalkulatoren, ved hjelp av tastene elementet:

Vi oppretter bare et oppslagstabell, slik at nar en tast trykkes, gjor det det samme som om du hadde trykket pa en knapp. Vi har ogsa kartlagt Escape-tasten til et avsluttingssignal (som vi kobler til i hovedmenyen ()).

Kritisk tenking.

Men hvis vi setter oss ned og tenker pa denne kalkulatorimplementeringen & # 8230; hva er dens mangler? (Og husk, vi fokuserer pa kodeforhold, og ikke hvor sexy det ser ut.)

UI og Engine kommuniserer gjennom en ASCII-protokoll. Vi vet at dette ikke skiller seg bra, og det gir heller ikke fleksibilitet eller internasjonalisering. Den handterer heller ikke tillegg eller fjerning av knapper (for eksempel for forskjellige kalkulatormoduser). Motoren kommuniserer alltid hele sin tilstand til brukergrensesnittet. Denne tilstanden sendes via signal / spor parametere. Som staten blir storre, vil dette mose ting ned. (Det vil si at dette ikke skal v re bra, enten.) Forbindelsen mellom brukergrensesnittet og motoren styres av main (), der vi manuelt koblet alle signaler og spor. Dette er litt feilaktig og er ikke dynamisk.

Kan du tenke pa andre mangler i denne arkitekturen? Vi snakker om dem i folgende blogginnlegg.

Button.qml – Knappkomponenten.

[1] Det kan hende du merker at topptekstene mine er & lt; QtGui / QGraphicsObject & gt; , inkludert modulen. Jeg har funnet ut at dette gjor ting litt enklere nar du ikke bruker QMake. For eksempel stotter CMake 2.8 ikke for oyeblikket konfigurasjon for QDeclarative-modulen. A legge til modulen i toppteksten gjor det litt enklere.


Vil du spille i det beste kasinoet? Vi fant det for deg. Trykk her nå!