Qt Forum.

Signal & # x2F; Spor mellom tradene Qt 5.

Jeg har et problem med Qt meta-type system og signal og sporforbindelser.

Jeg prover a koble et signal og spor med hverandre. Signalet ser slik ut:

signaler: void sigSaveFileName (QString &;);

private spor: void slotPutSaveFileName (QString og navn);

For jeg kobler dem, vil jeg gjerne registrere QString med qRegisterMetaType () -metoden og ringe tilkoblingsmetode:

Koble til (& _worker, & Arbeider :: sigOpenFileName, dette, og MainWindow :: slotPutOpenFileName);

Hvis jeg kjorer programmet, ser jeg programutgangen, og jeg far folgende advarsel:

QObject :: connect: Kan ikke kjore argumenter av typen ‘QString & amp;’

(Pass pa at ‘QString & amp;’ er registrert ved hjelp av qRegisterMetaType ().)

QObject :: connect: Kan ikke kjore argumenter av typen ‘QString & amp;’

(Pass pa at ‘QString & amp;’ er registrert ved hjelp av qRegisterMetaType ().)

og skjer ikke noe 🙁

Kan jeg fortelle meg hva jeg gjor feil?

Du trenger ikke a registrere QString, det du virkelig vil ha er.

void sigSaveFileName (const QString & navn);

void slotPutSaveFileName (const QString og navn);

Jeg tror at parameteridentifikatoren for signalet ikke er nodvendig ogsa.

Faktisk er det ikke, men det er renere IMHO.

Hvis jeg registrerer eller ikke, far jeg denne advarselen som utdata fra soknaden:

QObject :: connect: Kan ikke kjore argumenter av typen ‘QString & amp;’

(Pass pa at ‘QString & amp;’ er registrert ved hjelp av qRegisterMetaType ().)

QObject :: connect: Kan ikke kjore argumenter av typen ‘QString & amp;’

(Pass pa at ‘QString & amp;’ er registrert ved hjelp av qRegisterMetaType ().)

sa jeg tror dette er grunnen til at soknaden min ikke fungerer.

Oppdatering: Jeg vil gjerne bruke de for a kommunisere mellom trader: en GUI og en arbeiderrad. Pa grunn av prosjektet mitt er veldig stort, laget jeg en liten testkode. I dette programmet vil jeg gjerne kommunisere mellom et objekt som lever i hovedtrad og et annet objekt fra arbeidstraden.

I dette tilfellet far jeg samme melding, som nevnt ovenfor.

Overskriften ser ut som her:

klasse myThread: offentlig QThread & # 123;

signaler: void sig (QString & amp; contain);

privat: void run ()

klassemottaker: offentlig QObject & # 123;

offentlige spor: void slot (QString og noen)

og hovedmetoden:

int main (int argc, char * argv [])

QCoreApplication a (argc, argv);

Prov a sende Qt :: DirectConnection som en siste param (etterspor) i QObject :: connect. Qt :: QueuedConnection-tilkoblinger fungerer ikke mellom trader.

[sitat forfatter = «toptan» dato = «1368172580»] Prov a sende Qt :: DirectConnection som en siste parameter (etterspor) i QObject :: connect. Qt :: QueuedConnection-tilkoblinger fungerer ikke mellom trader. [/ Quote]

Faktisk er det den andre veien 🙂 QueuedConnection fungerer og stopper deg fra a bekymre deg for lasing av ressurser, mutexes etc. DirectConnection kan forarsake ulike traderproblemer (men det er ikke forbudt, du trenger bare a v re forsiktig). Quoting fra QThread dokumentasjon:

[quote] Merk: Hvis du samhandler med en gjenstand, ved hjelp av en hvilken som helst annen teknikk enn kos-signal / spor-tilkoblinger (for eksempel direkte funksjonssamtaler), ma de vanlige multithreadende forholdsregler tas. [/ quote]

Ikke bruk ny tilkoblingssyntax, ga tilbake til den gamle og bruk QueuedConnection, den skal fungere.

Det er noe som plager meg med ditt design. Tanken bak signal og spor er at du sender en verdi med et signal til et spor.

tomromspor (QString & noen) & # 123;

prover du a sende et signal og fa sporet tildele verdien til variabelen og lese den etter? Videre i et gjenget oppsett?

Det virker veldig «uvanlig»

Det er ikke bare «uvanlig». Det ber om en stygg krasj pa et tidspunkt. Signal sender en referanse til en lokal variabelstreng. Hvis det i kossporet skjer (og sannsynligvis vil i dette oppsettet) brann etter at strengen er odelagt, gar det inn i de fryktelige tingene land.

Det kan virke forst, fordi kompilatoren sannsynligvis optimaliserer den ved a plassere strengvariabelen pa samme sted i minnet, men det er en feil ved design.

Dette ville v re ok (vel, sorta, det er fortsatt styggt) med en direkte forbindelse, siden de er ganske mye et funksjonsanrop, men koforbindelser blokkerer ikke » ved a sende ut signaler.

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


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