Qt Forum.

Kan noen forklare hvordan de nye qt5-signalene og sporene fungerer.

Jeg lurte pa om noen kunne forklare hvordan de nye qt5-signalene og sporene fungerer, jeg er ny for de gamle, ikke si de nye. Jeg vet at du ma ha et signal og et spor, men de har til og med fjernet sokeordene i den nye versjonen, og det virker ikke sa lett a lese. Jeg har lest dokumentasjonen, men lesing og forstaelse er to forskjellige ting.

For eksempel har jeg dette.

Og det nye formatet er dette.

Det jeg ikke forstar er hvor er signalet, og hvor er sporet.

Hvorfor har QSlider erstattet sokeordet Signal, og det er ikke noe SLOT-sokeord. Det er vanskelig for meg a forsta konseptet med denne nye designen.

Jeg vet hva en QSlider, og jeg vet hva QProgressBar gjor, men jeg vet ikke hvordan jeg skal legge til dataene mine, og deretter ringe min funksjon.

Ikke misforsta at koden min fungerer, men jeg prover a fa hodet mitt rundt den nye syntaxen.

Eventuell hjelp vil bli verdsatt. Jeg har bare brukt QT i litt over en uke, sa jeg er veldig ny.

@Asimov Vel, forst av deg trenger du ikke bruke det nye formatet. I mange tilfeller bruker jeg fortsatt SIGNAL () og SLOT () -format.

Det nye formatet har fordeler og ulemper. En av de store proffene er evnen til a bruke en lambda til sporet. Sa du kan gjore noe som:

Koble til (obj, & MyObject: mySignal, [=] () & # 123; doSomethingHere (); & # 125;);

Det eliminerer behovet for a definere spilleautomater nar du gjor noe raskt, for eksempel a skrive ut en melding, oppdatere en etikett, endre en teller osv. Det kan alle gjores inline med en lambda.

Her er en artikkel om forskjellene mellom gammel og ny metode https://wiki.qt.io/New_Signal_Slot_Syntax.

Det burde forklare alt for deg. 🙂

QObject :: connect (modelBox, & QSlider :: valueChanged, this, & QProgressBar :: setValue);

I eksempelet ditt og QSlider :: valueChanged er pekeren til signalet og & QProgressBar :: setValue er pekeren til sporet, sa bestillingen er den samme som i den gamle forbindelsen.

et ekstra notat til lambdas.

Du kan potensielt gjore noe slikt:

Men hvis du skriver det slik, og din lbl_1 er uansett grunn, slettes appen din neste gang oppdateringen Labels kalles.

Siden siden 5.2 er det imidlertid en overbelastning som legger til et «kontekstobjekt». Nar objektet er odelagt, er forbindelsen brutt.

Jeg har ikke sett dette dokumentert godt nok enna, kanskje noen kan peke meg i riktig retning.

Du kan ganske enkelt endre tilkoblingsannonsen til dette:

og forbindelsen vil bli fjernet, hvor lbl_1 slutter a eksistere.

@ J.Hilk Kan du ikke bare legge til en innsjekk i lambda, noe som om (lbl_1) lbl_1-> setText (newValue); og nar du rydder opp lbl_1, sett det til nullptr.

Jeg har rlig ikke spilt med de nye stilesignalene og sporene mye. Ut av mange ars vaner pleier jeg a bruke SIGNAL () og SLOT () makroene, med mindre jeg spesielt trenger en lambda. Sa jeg har ikke lop inn i disse krasjscenariene enna.

Ja, selvfolgelig kan du gjore det pa den maten. Faktisk for jeg fant overbelastnings-kontekstobjektet, sa handterer jeg slike situasjoner.

Men problemet er at forbindelsen fortsatt eksisterer og tar opp en syklus av cpu. Ser ikke ut som mye, men hvis man ikke er forsiktig, kan den eksplodere ganske raskt.

Det er ogsa mulighet for en manuell frakobling:

Men det kan bety mange nye medlemsvariabler eller minst mange flere linjer med kode.

Den beste losningen er i gjerning – etter min mening – a sende det refererte kontekstobjektet til QObject :: Koble til:

Koble til (avsender, og Sender :: updateLabels, lbl_1, [=] (const QString & newValue) & # 123;

og la Qt handtere den potensielle frakoblingen internt.

@ J.Hilk Ja det hores ut som den foretrukne maten for meg ogsa. Jeg vil mye ha Qt handtere det. Jeg vil ikke lagre tilkoblingsvariabler og handtere a koble dem fra senere.

Og jeg vil absolutt ikke ha alle mine signaler oppbygget og ma kontrolleres selv etter at de ikke lenger er relevante. Det er definitivt en slosing med CPU-sykluser, og alt legger til. Det vil aldri v re sa sakte som Java skjont. ; P.

@Asimov Du ser ut til a ha for forskjellige tilkoblinger – forskjellige signaler og spor – i ditt eksempel. Strukturen av begge er.

sender_object, signal, mottaker_objekt, spor.

I den gamle syntaksen ma du markere signalet og sporet med makromarkorer. Med den nye er de ikke nodvendig, men du ma gi signalet og sporet i form av.

som er uttrykt som.

Jeg vet ikke hvor mye du vet lavt niva C / C ++ ting. Hvis du vet hvordan poengene skal fungere, forstar du dette. Medlemsfunksjonene til en klasse ligger et sted i minnet. Hver funksjon er felles for alle objekter av den klassen, som alle statiske data. Bare de normale datamedlemmene er per objekt. Sa i utgangspunktet hva du trenger for a ringe en medlemsfunksjon til et objekt, er objektet og pekeren til medlemsfunksjonen. Og du kan fa pekeren gjennom klassen. Derfor bruker du bade objektnavnet og klassenavnet i den nye syntaksen.

Pa viktig side av den nye syntaksen er at den sjekker kompileringstid at signalet og sporet er kompatible. Jeg har noen ganger kjort i en situasjon der i den gamle syntaksen jeg fikk argumenter feil og forbindelsen fungerte ikke, men det gir ingen feil. I tilfelle der det ikke er overbelastning, finner jeg den nye syntaksen kort og klar og enkel a skrive etter at du har v rt vant til syntaksen.

I noen tilfeller kan det fore til problemer hvis du ikke vet alle detaljene. Se for eksempel QAbstractSocket :: feil.

Dessverre ble det ikke dokumentert pa et sted hvor jeg provde a se pa (signal / spor dokumentasjon), men kompilatoren ga feil som jeg ikke forstod. Den gamle syntaksen virket. Du trenger ikke a si hvor stygg og vanskelig denne nye syntaksen med static_cast er.

et raskt tillegg til det med qt5.7 vi canshorten overload / static_cast drastisk:

Jeg vet litt om pekere a * angir en peker til en variabel, og en & amp; er adressen til variabelen pa det enkleste siktet.

Grunnen til at jeg vil l re det nye formatet er at jeg er bekymret for at de vil bli kvitt det gamle formatet som jeg bare har l rt.

Hvis et signal ikke er merket med en makro, hvordan gjor jeg datakrysset. Det er for en QTableView, sa vil jeg gjore noe som & QTableView :: dataChanged eller noe?

Jeg har ikke lest alle disse innleggene riktig enna, men kommer til a ha en god lesning na.

Takk for alle svarene. Jeg er ikke ny pa C ++, men jeg har litt rustet fordi jeg ikke har gjort mye i noen ar, mens 3D Modeling.

Jeg er imidlertid ny til QT.

PS. Jeg provde bare QTableView :: dataChanged og det virker ikke LOL.

PPS. Jeg vet ikke hva Lambda betyr.

Vis oss hvordan du gjorde dataChanged-signalet.

@Asimov Ja, & amp; tar adressen til en variabel. I dette tilfellet tar adressen til en funksjon. Du kan lagre adressen til en variabel som er en peker til en funksjon. I C + + 11, som for ovrig kreves av det nye signal / spor syntaks, kan du gjore det.

sgnl og slt er pekere til funksjoner (signaler er ogsa funksjoner). Jeg prover ikke engang a finne ut eksplisitt deres typer – det er der det automatiske sokeordet er veldig praktisk – men du kan se noen detaljer i http://www.cprogramming.com/tutorial/function-pointers.html. (Se ogsa «Beslektede artikler» der.)

Du trenger ikke a v re redd for at de blir kvitt den gamle syntaksen. Kanskje etter 10 eller 15 ar, men de vil ikke bryte eksisterende arbeidskode og kan ikke (enna) bli kvitt MOC (Meta Object Compiler som skaper C + + kode ut av Q_OBJECT, signaler :, slots: etc.) selv om de ville. Du kan lese https://woboq.com/blog/reflection-in-cpp-og-qt-moc.html og https://woboq.com/blog/verdigris-qt-without-moc.html for noen in- dybde diskusjon om MOC.

Jeg trengte ikke a gjore dette signalet, det er en del av QAbstractItemModel, og jeg bruker den pa en QStandardItemModel i en QTableView.

Mitt signal og spor fungerer fint. Jeg ville bare vite hvordan a gjore det pa qt5-maten.

PS. Jeg har allerede lest den artikkelen, men fant den sa klar som mudder LOL.

Det er fint a vite at de holder det gamle systemet for en stund, men jeg vil gjerne forsta det nye systemet.

Det andre var bare et eksempel, og jeg forstar ganske godt hvordan det fungerer, men jeg forstar ikke hvordan jeg bruker datatangangseksemplet i det nye formatet.

PS. Bare funnet ut at Lambda er som sma funksjoner uten navn. Ikke hort om disse for.

Bare provd dette. Jeg tror jeg er n r.

Men det gir meg en feil pa slutten. Jeg tror ikke & DbManager har rett. Det er navnet pa klassen min, som oppdateringsboklisten er i.

@Asimov Vel, det er bare.

i QAbstractItemModel, sa & QAbstractItemModel :: dataChanged (const QModelIndex & amp;) virker ikke. Ikke fortsett a plage oss, gi oss feilmeldingen. Har du provd.

? Noyaktigheten til dette er at dersom ingen av signalene eller sporene er overbelastet, bor du v re i stand til a forlate argumentene fordi funksjonsnavnene er entydige.

Hei det fungerte, det kalte min funksjon. Det var ikke sa ille som jeg trodde.

Jeg visste at jeg var n r, bare kunne ikke fa syntaxen.

Jeg lurer pa om det er noen mate a sende tabellindeksen til min funksjon?

Men den gode nyheten er at min funksjon blir kalt.

PS. Jeg klarte a fa indeksen som dette.

Dette er ma bedre enn det opprinnelige signalet og sporene jeg opprinnelig brukte.

@Asimov Du far allerede indeksene med det samtalen du gjor for a koble til. Bare slik at du vet med den oppdateringenBoxList-samtale, far du bare topLeft-indeksen, sa hvis du noen gang oppdaterer mer enn 1 indeks, handterer du ikke det tilfellet. for det du trenger:

Ja ambershark & topleft gir meg hva indeksen min ga meg. Egentlig jeg tror alt jeg gjorde var a gi nytt navn og topleft til a indeksere hvis du tenker pa det. Takk. Sa det nye formatet er ikke sa ille, tross alt, bare tar litt a bli vant til.

Takk til alle som svarte ogsa. Har v rt en stor hjelp.

BTW Jeg fortsetter a se pa din avatar og tenker firefox, og sa ser jeg igjen og det ser ut som en fisk.

@Asimov Lol ja det er en hai. en gulaktig en. 😉 Min firmalogo. Jeg har aldri tenkt pa det, men det betyr noe a dele en flyt med firefox. Hele sirkul r dyre logo-tingen.

Ja, du bare omdopte topLeft til indeks som er bra. Jeg pekte bare pa at hvis du ikke bruker topleft og bottomright og har flere indeksendringer enn din «indeks» vil ikke v re det du forventer at det skal v re. Hvis du kontrollerer oppdateringer for alltid a v re en enkelt indeks, vil du ha det bra skjont.

Jeg vet at jeg merket dette som lost, men jeg ville bare at du skulle vite at jeg fortsatt l rer. Jeg hadde ogsa et par andre signaler og spor som brukte det gamle formatet, men da de fortsatt jobbet, endret jeg ikke med det samme, og na har jeg klart a bytte det til det nye formatet uten problemer.

Og omskrives i nytt format.

Jeg sannsynligvis bare riper overflaten med signaler og spor, men jeg gar langsomt fremover. Takk alle.

Jeg sannsynligvis bare riper overflaten med signaler og spor, men jeg gar langsomt fremover. Takk alle.

Sannsynligvis ikke. Hvis du forstar den gamle syntaksen og forstar hvordan peker-til-medlem (og / eller funksjonspekere) fungerer sa vet du alt. Den nye Qt-syntaksen er ingenting annet enn den gamle syntaksen som er modifisert for a v re en praktisk pakke rundt pekeren til medlems syntaks C ++ gir.

For fullstendig er en peker til medlem en funksjonspeker, og en funksjonspeker er en variabel som lagrer adressen til en funksjon. Funksjoner ligger i den statiske delen av programmet (som Eeli K allerede nevnt). Sa du kan fa adressen til det minnet. Forresten er adressen til funksjonen noyaktig funksjonsnavnet i C ++-syntaks. 🙂

Du kan bruke funksjonspekere til a ringe funksjoner, selvfolgelig, vurder dette:

Utvide dette til klasser er noe trivielt. Det viktigste a vite er at (ikke-statiske) metoder er de samme som vanlig funksjon, dvs. de ligger i den statiske delen av programminnet, MEN de trenger et objekt a operere pa. Sa man kan fa en peker pa en metode pa samme mate, bare samtalen er litt annerledes som du ma binde den funksjonspekeren til en gjenstand. Omskrivning av eksemplene ovenfor med medlemspoengene er rettferdig:

Hele poenget med dette er at du kan lagre variabelen peker-til-medlem uten a spesifisere en gjenstand til siste oyeblikk – nar samtalen er ferdig. Og dette er hva Qt gjor, det lagrer pekerne og binder objektet (med. * Eller -> -operatoren bare nar den faktiske samtalen er laget.

Selv om vi aksepterer, som det grunnleggende prinsippet om ekte demokrati, er den ene moronen lik ett geni, er det nodvendig a ga et skritt videre og hold fast at to moroner er bedre enn ett geni?

Ser ut som din forbindelse til Qt Forum var tapt, vent mens vi forsoker a koble til igjen.


Hei! Vil du spille i det mest populære kasinoet? Vi forbereder det for deg. Prøv her nå!