Slik registrerer du en klasse for a bruke den i et QWebChannel-signal i Qt.

Slik registrerer du en klasse for a bruke den i et QWebChannel-signal i Qt.

Jeg bruker QT 5 med en WebChannel til a kommunisere med en HTML-side.

Jeg har lykkes i stand til a kommunisere tekster og strenger. men jeg vil gjerne kommunisere noen poengdata.

“Ingen manuell melding passerer og serialisering av data kreves,”

Vet ikke hvordan man skal handtere data, bruk qRegisterMetaType for a registrere det.

For a bruke typen T i QVariant, er det nok med Q_DECLARE_METATYPE (). For a bruke typen T i ko-signal og sporforbindelser, ma qRegisterMetaType () kalles for den forste tilkoblingen er opprettet.

I min egen kode bruker jeg Q_DECLARE_METATYPE for klasser jeg vil lagre i en QVariant (denne makroen ma settes pa globalt plan). Og jeg qRegisterMetaType & lt; T> () for klasser jeg vil bli sendt til signaler / spor (denne funksjonen ma ringes for signal.slot-tilkoblingen er laget). Jeg matte aldri ringe bade hvis jeg bare brukte en funksjon.

Sa, for ditt eksempel, bor dette fungere:

For signal / slot-erkl ring:

Hvis qRegisterMetaType ikke ble kalt, kan du bare bruke signal / spor som passerer MyData med referanse eller peker (oppgi signalet som ugyldig oppdateringsdata (MyData & data); eller ugyldig oppdateringsdata (MyData * data);). Da ma du v re veldig forsiktig hvis du gjor asynkronisk tilkobling (som Qt :: QueuedConnection) fordi, som sporet skal utfores “senere”, ma du garantere at objektreferansen forblir gyldig til sporet blir utfort etter at du har slukket signalet. Hvis qRegisterMetaType ble kalt, kan du bruke signal / spor som passerer MyData ved kopi (erkl re signalet som ugyldig oppdateringsdata (MyData data);). Og det er trygt a gjore asynkron forbindelse med de objektene som passerer kopien, da Qt er i stand til a serialisere objektet (som betyr at hvis sporet blir utfort “senere”, vil det til slutt bli kalt med et helt nytt MyData-objekt kopiert fra den opprinnelige du sendte signalet ut uten qRegisterMetaType, Qt kan ikke gjore denne “kopien”).

Sorg for at MyData-deklarasjonen er kjent nar du gjor dette (ingen videresendelseserkl ring).

Merk ogsa at ikke alle klasser / strukturer kan registreres pa denne maten, de ma ha:

en offentlig standardkonstruktor, en offentlig kopiekonstruktor og en offentlig destructor.

Det er tilfellet for MyData-klassen (standardene er OK), sa det skal fungere greit.


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