Вот пример, который работал для меня после выполнения всех исправлений.В этом примере показано, как сохранить / загрузить struct
или class
в файл с помощью QDataStream
.Структура, то есть myStruct , имеет три члена: int
, string
и struct
, то есть mySubStruct .
- Для каждого
struct
/ class
необходимо перегрузить операторы <<
и >>
. - В каждом перегруженном операторе сохранить / загрузить структурудостигается путем разбиения структуры на ее примитивные члены .Примитивными членами являются типы, которые поддерживаются QDataStream .
comment 1: В следующем примере используется перегрузка операторов в struct
.Чтобы узнать, как перегрузить операторы на class
, см. эту ссылку .
комментарий 2: Эта ссылка является полным примером.
mysubstruct.h
#ifndef MYSUBSTRUCT_H
#define MYSUBSTRUCT_H
#include <QString>
#include <QDataStream>
struct mySubStruct
{
int intVar;
QString strVar;
/* overload the operators */
friend QDataStream &operator<< (QDataStream &out, const mySubStruct &rhs)
{
out << rhs.intVar << rhs.strVar;
return out;
}
friend QDataStream &operator>> (QDataStream &in, mySubStruct &rhs)
{
in >> rhs.intVar >> rhs.strVar;
return in;
}
};
#endif // MYSUBSTRUCT_H
mystruct.h
#ifndef MYSTRUCT_H
#define MYSTRUCT_H
#include <QString>
#include <QDataStream>
#include "mysubstruct.h"
struct myStruct
{
int intVar;
QString strVar;
mySubStruct subStructObj;
/* overload the operators */
friend QDataStream &operator<< (QDataStream &out, const myStruct &rhs)
{
out << rhs.intVar << rhs.strVar << rhs.subStructObj;
return out;
}
friend QDataStream &operator>> (QDataStream &in, myStruct &rhs)
{
in >> rhs.intVar >> rhs.strVar >> rhs.subStructObj;
return in;
}
};
#endif // MYSTRUCT_H
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFile>
#include <QString>
#include <QDebug>
#include "mystruct.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp показывает, как реализованы операторы.
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
/* create struct */
mySubStruct subStructIn;
subStructIn.intVar = 1;
subStructIn.strVar = "a";
myStruct structIn;
structIn.intVar = 11;
structIn.strVar = "aa";
structIn.subStructObj = subStructIn;
/* open file */
QFile myFile("myFile");
/* save */
if(myFile.open(QIODevice::WriteOnly))
{
QDataStream save(&myFile);
save.setVersion(QDataStream::Qt_4_6);
save << structIn;
myFile.close();
}
/* load */
myStruct structOut;
if(myFile.open(QIODevice::ReadOnly))
{
QDataStream load(&myFile);
load.setVersion(QDataStream::Qt_4_6);
load >> structOut;
myFile.close();
}
qDebug() << structOut.intVar;
qDebug() << structOut.strVar;
qDebug() << structOut.subStructObj.strVar;
qDebug() << structOut.subStructObj.intVar;
}
MainWindow::~MainWindow()
{
delete ui;
}