Problem with gbinary files, and QVector
-
@mrjj Back to that QFile for one moment, i have to inherit that QDataStream, and overload the operators?
-
@Loc888 No, you just implement << and >> operators for your own data types.
See documentation: http://doc.qt.io/qt-5/qdatastream.html#
You need:QDataStream &operator<<(QDataStream &, const YOUR_TYPE &); QDataStream &operator>>(QDataStream &, YOUR_TYPE &);
You don't have to do it for Qt types like QVector.
-
@jsulm Ok, i took a look, and it says
"In addition to the overloaded stream operators documented here, any Qt classes that you might want to serialize to a QDataStream will have appropriate stream operators declared as non-member of the class:"
So i have to do that, outside the class, but how to use it then? If i crate a object, then how to use that overloaded operators?
-
@Loc888 said in Problem with gbinary files, and QVector:
So i have to do that, outside the class, but how to use it then? If i crate a object, then how to use that overloaded operators?
Hi
That is the easy part.
Simply try it and seeQFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << *yourclassptr;
(note the *)
if Qt can find an << for a type, it will simply use it.That way, you can << anything you like.
-
@mrjj Ok, i try. SO i have to do a class, put there thise operators, and then use:
out << *new_class ?
-
@Loc888
Yes and the reason for the * in from of object pointer is that the header says
(QDataStream &, const YOUR_TYPE &); << referenceso if you give it the pointer without *, it
will save/stream the address of the object as it then matches << for int instead.
so say always use * when you have a pointer to an object with << -
Hi
Just to be sure
can you show your
QDataStream &operator<<(QDataStream &, const YOUR_Class &);
implementation.
(not the .h declaration) but the actual body of it. -
@mrjj In the QDataStream Class it looks like that, so i guess i am gonna use this template, except i am gonna use a custom data:
inline QDataStream &QDataStream::operator<<(quint16 i)
{ return *this << qint16(i); } -
Hi
Here is small sample.--in the .H file-- class MyClass { public: int value = 6; QString name = "test"; }; QDataStream &operator<<(QDataStream &out, const MyClass &); QDataStream &operator>>(QDataStream &in, MyClass &); ----------- --in the .CPP file-- QDataStream &operator<<(QDataStream &out, const MyClass &classRef) { return out << classRef.value << classRef.name; // save each member of your class } QDataStream &operator>>(QDataStream &in, MyClass &classRef){ return in >> classRef.value >> classRef.name; // read in IN SAME order } ------------------------------ //--test of saving-- { QFile file("e:/file.dat"); file.open(QIODevice::WriteOnly); QDataStream out(&file); MyClass *ptr = new MyClass; out << *ptr; } //--test of loading-- { QFile file("e:/file.dat"); file.open(QIODevice::ReadOnly); QDataStream in(&file); MyClass *otherptr = new MyClass; in >> *otherptr; }
-
@mrjj Something weird is happening, i declared those operators in a header file, then include it, and it's working, if i use that MyClass pointer, then i get the error..
-
@Loc888
What error? -
@mrjj Nope, it's ok... I just typed the wrong object type. It's working finnaly. Thanks
everybody for help. -
@Loc888
Good work. :)
please mark as solved then. -
@mrjj It's solved, but i don't wanna close it, maybe somebody will need help with that STD stuff, i leave it behind for now, because this motheod is cleaner and faster.
-
@Loc888 Please close. If somebody has a problem/question he/she can open a new thread. Your problem is solved, right?