(gelöst) QT 4.5 Eigene Operator für QDataStream
-
Hi,
hat jemand eine Info, wie man eine eigenen Operator für steaming über die Klasse "QDataStream" erstellt.
Unter http://doc.trolltech.com/4.5/qdatastream.html#details
konnte ich nur die bestehenden unterstützen Datentypen finden und ebenso ein Hinweis, wie man es für weitere QT Klassen macht, nicht jedoch, wie man es für seine eigene Klasse erstellt.
Gruss
-
hm, wo liegt das Problem?
Zwei "Non-Members" in dieser Form anlegen:
QDataStream& operator<<(QDataStream &, const YourClass &); QDataStream& operator>>(QDataStream &, YourClass &);
und dort entsprechend weiter verfahren... entweder in primitive Typen aufbrechen
QDataStream& operator<<(QDataStream& stream, const YourClass& class) { stream << class.X() << class.Y(); return stream; }
oder direkt Binär schreiben/lesen
QDataStream& operator<<(QDataStream& stream, const YourClass& class) { stream.writeRawData(class.constData(), class.lengthOfData()); return stream; }
-
Danke für die tolle Antwort.
Edit:
So hier das Ergebnis.
Ich habe hier jedoch das Problem, das ich beim Output "const" nicht einsetzen
kann, da sonst die Meldungerror: passing 'const DataBlock' as 'this' argument of 'QDateTime DataBlock::getStorageTime()' discards qualifiers
error: passing 'const DataBlock' as 'this' argument of 'QString DataBlock::getDescription()' discards qualifiers
error: passing 'const DataBlock' as 'this' argument of 'QByteArray DataBlock::getData()' discards qualifiersvom Compiler kommt ?!
class DataBlock { .... }; QDataStream& operator<<(QDataStream &, DataBlock &); QDataStream& operator>>(QDataStream &, DataBlock &);
QDataStream& operator<<(QDataStream& stream, DataBlock& data) { stream << data.getStorageTime() << data.getDescription() << data.getData(); return stream; }
QDataStream& operator>>(QDataStream& stream,DataBlock& data) { QDateTime Temp1; QString Temp2; QByteArray Temp3; stream >> Temp1 >> Temp2 >> Temp3; data.setData(Temp3); data.setDescription(Temp2); data.setStorageTime(Temp1); return stream; }
Gebe ja zu, da ich hier das erstmal einen Operator überschreibe.
Ist das den so jetzt korrekt oder kann man hier noch was besser machen.Bei der Input Routine bin ich mir nicht ganz so sicher, ob man das über Temp
Variablen löst.
Die eigentlichen Variablen sind aber privat und da habe ich kein Zugriff aus der
Funktion drauf. Soll auch so bleiben.Gruss
-
Also, wenn der gepostete Code wirklich und wahrhaftig der aus deinem Projekt ist, liegt der Fehler nicht in den Operatoren
Fehler wieerror: passing 'const DataBlock' as 'this' argument of 'QDateTime DataBlock::getStorageTime()' discards qualifiers
sagen IMMER, dass die Methode nicht als const deklariert wurde und deshalb nicht für ein const-Objekt ausgerufen werden können!
Gehen würde es wenn das in DataBlock so auschaut:class DataBlock { ... public: QDateTime getStorageTime() const; // <--- beachte das const am Schluss! ... };
-
Danke für den Tip
nachdem ich
QString getDescription( void ) const;
QString DataBlock::getDescription( void ) const { .... }
für alle Funktionen verwendet habe, klappt es auch mit dem "Nachbarn".
Ich habe das Const immer vorne geschrieben
.
Gruss
P.S.: Kaum macht man es richtig, schon funktioniert es.