[geloest] QSignalSpy - double& parameter?

Alles rund um die Programmierung mit Qt
Antworten
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

[geloest] QSignalSpy - double& parameter?

Beitrag von -=Freaky=- »

hi,

ich habe in einer klasse ein signal, welches als parameter 4 mal eine referenz auf double enthaelt.
das moechte mit hilfe von QSignalSpy testen.

Code: Alles auswählen

QSignalSpy spyChange( &elem1, SIGNAL( dataChanged( double &, double &, double &, double & ) ) );
kompilieren tut das problemlos, beim ausfuehren gibt es diese meldung (4 mal hintereinander):

Code: Alles auswählen

QWARN  : Don't know how to handle 'double&', use qRegisterMetaType to register it.
fuege ich nun die zeile

Code: Alles auswählen

qRegisterMetaType< double& >();
ein (so funktioniert es bspw. mit allen enums die ich benutze), gibt es beim kompilieren die meldung

Code: Alles auswählen

error: no matching function for call to 'qRegisterMetaType()'
entsprechend gibt es bei

Code: Alles auswählen

qRegisterMetaType< double& >( "double&" );
die meldung

Code: Alles auswählen

error: no matching function for call to 'qRegisterMetaType(const char [8])'
das ganze funktioniert also auf diesem wege anscheinend nicht.
nun moechte ich das signal ungerne aendern, nur, damit ich es testen kann ...
umstaendliche workarounds fuers testen zu basteln, das muss ich auch nicht haben.
laesst sich das also irgendwie vermeiden, sodass ich vielleicht doch QSignalSpy hier nutzen kann oder liegt mein fehler evtl. ganz wo anders?

danke im voraus!

mfg,
julian
Zuletzt geändert von -=Freaky=- am 18. Juli 2008 18:32, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Macht eine Referenz auf einen double wirklich Sinn? Vor allem, wenn man keine Parameter zurückgeben kann.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

soviel vorweg: ich kenn mich mit der technik hinter signals/slots nicht wirklich aus.
ich habe aber, wie bei normalen funktionen, darauf gehofft, dass, wenn ich eine referenz auf double uebergebe, auch eine referenz auf double und eben keine kopie eines double uebergeben wird, womit man die paar bytes sparen könnte.

ich habe das schon immer rein prinzipiell so gemacht, dass da, wo call-by-reference möglich und sinnvoll war (im sinne von einer variable >= der groesse e. zeigers, 4byte), das eben vorzuziehen.

mfg,
julian
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ein Zeiger ist 4 Byte groß, wenn du eine 32 Bit-Maschine hast. Bei einer 64 Bit-Maschine ist ein Zeiger genauso groß wie ein double. Also, denke ich, daß Referenzen bei 'nicht-Klassen-Typen' keinen Sinn machen.

Nachdem Qt anscheinend der selben Meinung ist, mußt du halt den Datentypen 'double &' selbst registrieren. Du könntest natürlich auf 'const double &' umstellen, was in diesem Falle sinnvoller ist und event. sogar von Qt her schon bekannt sein könnte.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Egal ob Referenz oder nicht - das Signal heißt dataChanged( double, double, double, double ) wie jedes andere normalisierte Signal auch.
Und ne Referenz auf nen double ist wirklich schon arg... übertrieben. Da gibts sicherlich bessere Dinge die wesentlich mehr bringen als 4 anstatt 8 Byte auf einem 32-Byte System.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

alles klar, danke fuer die antworten.
mir war klar, dass es nichts grossartiges bewirken wird, immer eine referenz zu uebergeben, aber das war halt gewohnheitssache und ich habs schon oefter bei anderen programmierern gesehen, weshalb ich mir keine gedanken drum gemacht hab, kann ja nicht schaden.

ich habe jetzt auf double (keine referenzen mehr) umgestellt und das funktioiert wir erwartet gut.

danke.

mfg,
julian
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das was Du da angibst ist nicht die Funktionsdefinition sondern der Name des Signals. Und der darf keine & und ach keine Variablennamen enthalten.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ist mir klar soweit, bis auf die sache mit den variablennamen.
natuerlich ist es logisch, keine anzugeben, aber probleme hatte ich damit auch noch nicht.
nur beim connecten darf man sie nicht angeben.

// edit:
QLineEdit bietet bspw. folgende signals:

Code: Alles auswählen

void textChanged ( const QString & text )
void textEdited ( const QString & text )
das sind ja anscheinend auch referenzen auf QString, nur eben konstante.

mfg,
julian
Antworten