There is a function for loading data from a file using QDataStream:

void tgTableModel::Load(QString &path) { QFile file(path); if(file.open(QIODevice::ReadOnly)) { m_ptargetList->clear(); QList<target> list; //target моя структура QDataStream in(&file); in.setVersion(QDataStream::Qt_5_7); in >> list; m_ptargetList = &list; file.close(); } } 

In order for this to work, I defined functions for the target structure:

 struct target{ QString name; QString description; int priority; QDate deadline; Status::Value ready; }; QDataStream &operator << (QDataStream &stream, const target &tg) { stream << tg.name; stream << tg.description; stream << tg.priority; stream << tg.deadline; stream << tg.ready; return stream; } QDataStream &operator >> (QDataStream &stream, target &tg) { stream >> tg.name; stream >> tg.description; stream >> tg.priority; stream >> tg.deadline; stream >> tg.ready; return stream; } 

And also defined the functions for stream >> tg.ready; and stream << tg.ready;

 class Status: public QObject { Q_OBJECT public: explicit Status(QObject * parent = nullptr): QObject(parent){} enum /*class*/ Value{in_waiting, deferred, completed, in_process, nVariant}; Q_ENUM(Value) friend QDataStream &operator << (QDataStream &stream, const Status::Value &val) { stream << (int)val; return stream; } friend QDataStream &operator >> (QDataStream &stream, Status::Value &val) { stream >> (int)val; // вот тут выбивает 4 ошибки!!! return stream; } }; 

But in the specified place, it beats 4 identical errors that I would not do: "... error: C2679: binary '>>': no ​​operator found the type of 'int' (or there is no acceptable conversion) "

Help fix, pls. Thank you in advance!

  • one
    And if so int i; stream >> i; val = i; int i; stream >> i; val = i; ? - yrHeTaTeJlb
  • friend QDataStream &operator >> (QDataStream &stream, Status::Value &val) { quint32 num; stream >> num; val = static_cast<Status::Value>(num); return stream; } friend QDataStream &operator >> (QDataStream &stream, Status::Value &val) { quint32 num; stream >> num; val = static_cast<Status::Value>(num); return stream; } In total, 17 errors: "mainwindow.obj: -1: error: LNK2005:" class QDataStream & __cdecl operator >> (class QDataStream &, struct target &) "(?? 5 @ YAAEAVQDataStream @@ AEAV0 @ AEAUtarget @@@ Z) already defined in main.obj " - Andrey
  • one
    Well, this is better, before there were compilation errors, and now linking errors :) - yrHeTaTeJlb
  • And what to do next? - Andrey
  • At the very end, there is still such an error: "debug \ Organizer.exe: -1: error: LNK1169: one or more multiply defined symbols found" - Andrey

1 answer 1

 inline QDataStream &operator << (QDataStream &stream, const target &tg) { stream << tg.name; stream << tg.description; stream << tg.priority; stream << tg.deadline; quint32 Num = static_cast<quint32>(tg.ready); stream << Num; return stream; } inline QDataStream &operator >> (QDataStream &stream, target &tg) { stream >> tg.name; stream >> tg.description; stream >> tg.priority; stream >> tg.deadline; quint32 Num; stream >> Num; tg.ready = static_cast<Status::Value>(Num); return stream; } 

That's how it compiles.