Q_object-spor

Fa via App Store Les dette innlegget i var app!

Nar skal Q_OBJECT brukes?

Dokumentasjonen sier at:

Q_OBJECT-makroen ma vises i den private delen av en klasses Definisjon som erkl rer sine egne signaler og spor eller som bruker andre tjenester levert av Qts meta-objekt-system.

Men akkurat hva betyr det? Pa hvilke QObject-avledede klasser kan jeg utelate det trygt? Vil det oppsta problemer hvis du unnlater Q_OBJECT pa en QObject-avledet klasse, og arver deretter fra den ene? I utgangspunktet vil jeg ha litt mer informasjon om nar jeg kan utelate det fra min Qt-klasser.

Du bor bruke Q_OBJECT-makroen for alle ikke-templerte klasser som kommer fra QObject.

Foruten signaler og spor, gir Q_OBJECT-makroen metaobjektinformasjonen som er knyttet til gitt klasse.

Vi anbefaler pa det sterkeste at alle underklasser av QObject bruker Q_OBJECT-makroen, uansett om de faktisk bruker signaler, spor og egenskaper.

Anta at vi har folgende klasse:

Uten Q_OBJECT vil folgende metaobjekt-systemfunksjoner (blant andre) ikke fungere for klasse:

qobject_cast & lt; Class & gt; () – pa grunn av manglende metadata.

QObject :: tr () – pa grunn av manglende metadata.

slots og invokables forst erkl rt i klasse, nar pakalt eller sett opp etter navn – ingen av QMetaObject metoder vil fungere for disse metodene, og Qt 4 vil ikke koble til – pa grunn av manglende metadata.

signaler – siden moc ikke vil generere sine implementeringer og koden vil ikke kompilere.

Du kan unnlate det selvfolgelig, men hvis du noen gang bruker disse funksjonene, ma du huske a sette makroen i klassens erkl ring. Dette er en ganske spro praksis og best unngas. Besparelsene er ikke verdt det. Sa vent ikke – legg til Q_OBJECT-makroen til hver klasse som kommer fra QObject som et sporsmal om kodingspolitikk.

Q_OBJECT-makroen skal aldri brukes pa klasser som ikke kommer fra QObject. For a legge inn invokables og egenskaper til slike klasser, bruk Q_GADGET makroen i stedet.

Hvis du vil bruke signaler / spor, ma du inkludere Q_OBJECT-makroen og avlede klassen fra QObject.

Ellers kan du legge det ut, men det gjor ingen skade for a inkludere den i alle Qt gui-klassene.

Vel, den forste delen er ganske klar som du sikkert allerede vet .. signaler og spor, resten av Meta-objekt-systemet er litt mindre kjent. Kanskje en av de mer nyttige funksjonene er dynamiske egenskaper. Selv om disse har mange bruksomrader, brukte jeg dem til a dra nytte av Qts animasjonssystem QPropertyAnimation.

Det er litt mer info om meta-objekt-systemet her: http://doc.qt.io/archives/4.6/metaobjects.html.

Jeg tror bunnlinjen er, hvis du arver fra QObject-hierarkiet, kaster du inn Q_OBJECT-makroen uansett. Det er enkelt a gjore og vil redde deg fra noen potensielt forvirrende problemer nedover veien.

Hva @liaK sa er riktig (kort sagt: du bor alltid bruke Q_OBJECT makroen i en hvilken som helst klasse som kommer fra QObject).

En ting jeg ikke har sett fremhevet er at hvis du ikke eksplisitt legger Q_OBJECT-makroen, sa bruker den noen ganger veldig hendig qobject_cast ikke til a fungere.