Qt-spor og signaler eksempel

Min favoritt Qt-funksjon er Signal / Slots-mekanismen. For jeg jobbet med Qt, visste jeg bare grusomhetene til Java-hendelseshandtering ved a implementere grensesnitt og biblioteker som bare fungerte med enkle funksjoner, men ikke med klassemetoder. Qt var det forste biblioteket som fikk lov til a handtere et arrangement i en metode for en bestemt objektinstans – som er det du egentlig vil mesteparten av tiden. Dessverre er Qt Signal / Slots ikke veldig godt integrert i spraket. Dette skyldes hovedsakelig preprosessormekanismen som bare fungerer pa deklarasjonene. Dermed er setningssyntaxen fin, men bruken av signaler og spor i definisjonen har noen problemer og begrensninger:

Det mangler kompileringstidskontroller. Du kan mispell signal eller slot navn, kan du.

Koble et signal til et spor selv nar signaturen ikke stemmer overens og sa videre. Dette skjedde for meg altfor ofte, og jeg la merke til problemet da soknaden kjorte. I de fleste enkle tilfeller er det ikke sa ille, nar alle signal / slots er koblet ved oppstart, kan du se feilene pa STDOUT (en darlig losning IMHO, det bor kaste unntak eller utgang). Men det blir verre nar du skriver mer komplisert kode som kobler signal / slots pa et senere tidspunkt. Jeg hadde dette flere ganger, for eksempel min Desktop Sharing-klient rewires signal / slots pa bestemte hendelser.

Deretter blir en feil tilkobling () veldig stygg, fordi det kun kan utlose en feil i sjeldne situasjoner, og feilen er bare synlig nar du ser STDOUT. Du kan ikke bruke spor som mal for tilbakeringinger eller pakalle et spor etter navn. Dette var absolutt ikke et designmal for Qt signal / slots, men det gjor mekanismen mindre kraftig enn C # s delegater og skaper behovet for en andre mekanisme. Koblingssyntaxen er unodvendig komplisert pa grunn av SIGNAL () / SLOT () makroene. Ikke sa ille, men syntaksen kan v re lettere hvis den skulle bli integrert i spraket. Et annet mindre syntaksproblem er sporingsordet. Det bor ikke v re nodvendig a erkl re et spor, det ville v re lettere a kunne koble til en hvilken som helst metode. Det skjedde med meg mer enn en gang at jeg trengte a skrive et spor som ikke gjorde noe annet enn a ringe en funksjon.

For jeg fortsetter a vise C # s delegertefunksjon, er dette et stykke kode som bruker signal / spor i Qt. Jeg vil bruke den som en referanse for a vise andre syntakser:

Som du ser, skaper det en tellerklasse som bruker et Qt-signal for a varsle spor.

nar tellerens verdi har endret seg. CounterTest lager en teller, kobler et spor.

som underretter brukeren om endringer og endrer det et par ganger.

Denne linjen erkl rer en delegattype kalt ‘IntModifierCallback’ som far et heltall som argument og returnerer en int. Erkl ringen ser ut som om delegerte ville v re en annen innfodt C # -type, som kan sammenlignes med C ++-funksjonstipsene, men faktisk delegerte typeerkl ringer er bare syntaktisk sukker for en vanlig klassedeklarasjon. Dette er en forenklet versjon av den genererte koden:

Konstruktoren tar objektet forekomsten som det forste argumentet, og en funksjonspeker som et sekund.

‘Invoke’ samsvarer alltid med underskrift av delegattypen og ma kalles for a pakalle delegatinstansen.

eiendom, men har to viktige forskjeller: Andre klasser kan bare bruke ‘+ =’ og ‘- =’ operatorer,

men kan ikke paberope seg eller erstatte delegaten. Og du trenger ikke a skrive accessor.

metoder for eiendommen, de er opprettet automatisk (du kan skrive dem selv hvis du vil ha).

Alle delegerte typer skal v re anonyme, og det bor bare v re en type for hver signatur. Dermed har alle delegater med identisk signatur alltid samme type. Dette er en forutsetning for de folgende punktene. Opprettelse av en delegert forekomst i C # er relativt komplisert og krever eksistensen av funksjonspekere. En enklere losning er a fa en delegert forekomst ved a fa tilgang til metoden som et felt / eiendom. Saledes hvis du har en referanse til et «CounterUser» -objekt kalt ‘cu’, kan du fa en delegat til sin counterChanged () -metode ved hjelp av «cu.counterChanged». I stedet for a erkl re delegerte typer kan du definere en delegat ‘prototype’ som definerer funksjons signaturen. Prototypen er bare en moniker for den anynymose typen, ikke en ekte typedeklarasjon, men mer som en typedef.

Dermed er flere prototyper med samme funksjons signatur men forskjellige navn fortsatt kompatible. Navnet pa prototypen skal ikke eksporteres eller vises som en del av API.

Den er gyldig for hele kildefilen nar den er definert overst eller gyldig for klassen hvis den er definert i klassekroppen. Syntaxen er som definisjon av delegat, men med et «prototype» sokeord i stedet for «delegere». Hendelser kan alternativt defineres med «delegat» -syntaxen og dermed uten a erkl re en prototype. Dette er den vanligste bruken av delegater, og med denne funksjonen trenger du sjelden a definere en prototype. Sokeordet «delegert» er ikke nodvendig lenger.

Merk at det ikke lenger er behov for delegat eller prototype. Delegatortypen trenger ikke et navn.

Det frigjor utvikleren fra a navngi delegatetyper. A finne gode delegertypenavn viste seg a v re ganske vanskelig, og folk begynte a bruke ordninger som bare beskriver prototypen (som IntIntToBool), som bare er dumt. Protoype navn spiller ingen rolle fordi de ikke vil bli utsatt som API, og er ikke nodvendig for hendelser. Sokeordet «delegat» var forvirrende fordi det foreslo at du oppretter en delegat (= eksempel),

men du opprettet en delegertype. Det er som a bruke et «objekt» sokeord i stedet for «klasse». ‘prototype’ er klarere. Det fungerer fint pa sprak som Java som ikke har funksjonspekere (som trengs.

i C # -syntaxen for det andre argumentet fra den delegerte konstruktoren). Syntaxen for opprettelsen av delegerte instanser er vennligere. Det kan ikke skje at den samme funksjonsnavnet har to inkompatible delegatetyper.

tjansen & # 039; s blogg Legg til en ny kommentar 2598 leser.

for dumme c # nybegynnere.

som elsker Qt. Ikke prov a implementere delen «Ny syntaks», det er et konsept, ikke mulig. Eller i det minste vil det ikke kompilere pa systemet mitt :).

Dette stedet er en blogging-plattform for KDE-bidragsytere. Den er bare vert for en brokdel av KDE-bidragsyterens blogger. Hvis du er interessert i alle, vennligst besok agregatoren pa Planet KDE.


Hilsen! Vil du spille i det beste kasinoet? Vi forbereder det for deg. Spill her nå!