Seite 1 von 1

[geloest] QSignalSpy - double& parameter?

Verfasst: 17. Juli 2008 19:03
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

Verfasst: 17. Juli 2008 19:21
von upsala
Macht eine Referenz auf einen double wirklich Sinn? Vor allem, wenn man keine Parameter zurückgeben kann.

Verfasst: 17. Juli 2008 20:02
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

Verfasst: 17. Juli 2008 20:17
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.

Verfasst: 17. Juli 2008 21:40
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.

Verfasst: 18. Juli 2008 18:31
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

Verfasst: 18. Juli 2008 18:39
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.

Verfasst: 18. Juli 2008 21:22
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