Kode interlude – signaler og spor.

Ray Rischpater.

(For flere ressurser relatert til dette emnet, se her.)

Qt tilbyr en bedre mate: signaler og spor. Som en begivenhet genererer sendekomponenten et signal i Qt-parlanse, og objektet sender et signal og mdash; som mottakerobjekter kan motta i et spor for formalet. Qt-objekter kan sende ut mer enn ett signal, og signaler kan b re argumenter; I tillegg kan flere Qt-objekter ha slots koblet til det samme signalet, noe som gjor det enkelt a ordne en til mange varsler. Like viktig, hvis ingen gjenstand er interessert i et signal, kan det sikkert ignoreres, og ingen spor sluttet til signalet. Ethvert objekt som arver fra QObject, Qt’s grunnklasse for objekter, kan sende signaler eller gi spor for tilkobling til signaler. Under hetten gir Qt utvidelser til C ++-syntaks for a deaktivere signaler og spor.

Et enkelt eksempel vil bidra til a gjore dette klart. Det klassiske eksempelet du finner i Qt-dokumentasjonen er en utmerket, og vi bruker den igjen her, med noen utvidelser. Tenk deg at du har behov for en teller, det vil si en beholder som inneholder et heltall. I C ++ kan du skrive:

Kontaklassen har et enkelt privat medlem, m_value, som har sin verdi. Klienter kan paberope verdien for a oppna tellerens verdi, eller sette verdien ved a pakalle setValue med en ny verdi.

I Qt, ved bruk av signaler og spor, skriver vi klassen pa denne maten:

Denne tellerklassen arver fra QObject, grunnklassen for alle Qt-objekter. Alle QObject-underklasser ma inkludere deklarasjonen Q_OBJECT som det forste elementet i deres definisjon; denne makroen utvides til Qt-kode som implementerer den underklasspesifikke limen som er nodvendig for Qt-objektet og signalsporingsmekanismen. Konstruktoren forblir den samme, og initialiserer vart private medlem til null. Tilsvarende forblir tilgangsmetodeverdien den samme, og returnerer gjeldende verdi for telleren.

En objekts spor skal v re offentlige, og deklareres ved hjelp av Qt-utvidelsen til C ++-offentlige spor. Denne koden definerer tre spor: et setValue-spor, som aksepterer en ny verdi for telleren, og stignings- og dekningssporene, som oker og reduserer verdien av telleren. Slots kan ta argumenter, men ikke returnere dem; kommunikasjonen mellom et signal og dets spor er en mate, initierer med signalet og avsluttes med sporene som er koblet til signalet.

Telleren tilbyr et enkelt signal. Som slots blir ogsa signaler deklarert ved a bruke en Qt-utvidelse til C ++-signaler. I eksemplet ovenfor sender et tellerobjekt signalverdien i forbindelse med et enkelt argument, som er den nye verdien av telleren. Et signal er en funksjons signatur, ikke en metode; Qts utvidelser til C ++ bruker typesignaturen til signaler og spor for a sikre typesikkerhet mellom signalsporforbindelser, en nokkelfordelingssignaler og spor har over andre dekoblede meldingsordninger.

Som utviklerne er det vart ansvar a implementere hvert spor i var klasse, uansett hvilken applikasjonslogikk som er fornuftig. Tellerklassens spor ser slik ut:

Vi bruker implementeringen av setValue-sporet som en metode, som er hva alle sporene er i sitt hjerte. SetValue-sporet tar en ny verdi og tilordner den nye verdien til variabelen til privatkursens private medlemskap hvis de ikke er de samme. Deretter sender signalet verdienChanged-signalet, ved hjelp av Qt-forlengelsen, som utloser en innkalling til sporene som er koblet til signalet.

Dette er et vanlig monster for signaler som handterer objektegenskaper: testing av egenskapen som skal settes for likhet med den nye verdien, og bare tilordne og sende et signal hvis verdiene er ulik.

Hvis vi hadde en knapp, si QPushButton, kunne vi koble det klikkte signalet til trinnet for okning eller reduksjon, slik at et klikk pa knappen okte eller dekrediterte telleren. Jeg vil gjore det ved a bruke QObject :: Connect-metoden, slik:

Vi lager forst QPushButton og Counter objekter. QPushButton-konstruktoren tar en streng, etiketten for knappen, som vi betegner som strengen Increment eller den lokale motparten.

Hvorfor sender vi dette til hver konstruktor? Qt gir en forelder-barnminnehandtering mellom QObjects og deres etterkommere, lette opprydding nar du er ferdig med a bruke en gjenstand. Nar du frigjor et objekt, frigjor Qt ogsa noen av foreldreobjektets barn, sa du trenger ikke. Forholdet mellom foreldre og barn er satt til byggetid; Jeg signaliserer til konstruktorene at nar objektet pakaller | denne koden er frigjort, kan trykknappen og telleren ogsa frigjores. (Selvfolgelig ma pakallingsmetoden ogsa v re en underklasse av QObject for at dette skal fungere.)

Deretter kaller jeg QObject :: Koble, passerer forst kildeobjektet og signalet som skal kobles til, og deretter mottakerobjektet og sporet som signalet skal sendes til. Typene av signalet og sporet ma samsvare, og signalene og sporene ma pakkes inn i henholdsvis SIGNAL og SLOT-makroene.

Signaler kan ogsa kobles til signaler, og nar det skjer, blir signalene koblet og utloser eventuelle spor som er koblet til nedstroms signaler. For eksempel kunne jeg skrive:

Dette kobler telleren b med telleren a, slik at enhver verdiendring til telleren a endrer ogsa verdien av telleren b.

Signaler og spor brukes over hele Qt, bade for brukergrensesnittelementer og for handtering av asynkrone operasjoner, for eksempel tilstedev relse av data pa nettverksstikk og HTTP-transaksjonsresultater. Under hetten er signaler og slots sv rt effektive, kokende ned til funksjonen forsendelsesoperasjoner, sa du bor ikke nole med a bruke abstraksjonen i dine egne design. Qt gir et spesialbyggingsverktoy, meta-objekt-kompilatoren, som sammenstiller utvidelsene til C ++ som signaler og slots krever og genererer tilleggskoden som er nodvendig for a implementere mekanismen.

I denne artikkelen l rte vi brukshendelsene med det formal a koble ulike objekter; Komponenter som tilbyr data innkapsler dataene i en hendelse, og en hendelsesloype (eller nylig en hendelselytter) fanger hendelsen og utforer en handling.

Ressurser for artikkel:

Du har lest et utdrag av:

Applikasjonsutvikling med Qt Creator.

Kontakt oss.

Ta kontakt her hvis du har sporsmal eller problemer.

Hjelp og stotte.

Klikk her for ofte stillede sporsmal, bestillingsinformasjon, T & C, errata og kode nedlastinger.

Varsler og tilbud.

Registrer deg pa vare e-postmeldinger for regelmessige oppdateringer, skreddersydde tilbud, eksklusive rabatter og bra gratis innhold.