gpt4 book ai didi

c++ - QDataStream 中的序列化类

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:38 25 4
gpt4 key购买 nike

我正在尝试保存 3 QVector<QPoint>和一个带有 QDataStream 的整数.

我重载了 operator<<() ,但如果我尝试保存某些内容,文件中不会显示任何内容。

我检查了 QVector是空的,但它不是。

这里是带有 operator<< 的 CloudData 类和 save()功能:

CloudData.h

#include <QDataStream>
#include <QVector>
#include <QPoint>

class CloudData
{
public:
CloudData();

QVector<QPoint> getPolyVector() const;
QVector<QPoint> getPathPointVector() const;
QVector<QPoint> getSupPointVector() const;
int getRandSeed() const;

bool save(QString);
friend QDataStream& operator <<(QDataStream &dataStream, const CloudData &cd)
{
dataStream << cd.getPolyVector() << cd.getPathPointVector()
<< cd.getSupPointVector() << cd.getRandSeed();
return dataStream;
}

private:
QVector<QPoint> m_polyVector;
QVector<QPoint> m_pathPointVector;
QVector<QPoint> m_supPointVector;
int m_randSeed;
};

CloudData.cpp

#include "clouddata.h"
#include <QFile>

CloudData::CloudData()
{
}

void CloudData::setPolyVector(QVector<QPoint> pVec)
{
m_polyVector = pVec;
}

void CloudData::setPathPointVector(QVector<QPoint> ppVec)
{
m_pathPointVector = ppVec;
}

void CloudData::setSuppPointVector(QVector<QPoint> spVec)
{
m_supPointVector = spVec;
}

void CloudData::setRandSeed(int randSeed)
{
m_randSeed = randSeed;
}

bool CloudData::save(QString filename)
{
QFile file(filename);
if(!file.open(QIODevice::WriteOnly))
return false;

QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_8);

out << this;
file.close();
return true;
}

最后,这里是调用 save() 的函数:

void CloudWidget::saveCloudData()
{
QString filename = QFileDialog::getSaveFileName(this,tr("Save cloud clutter data"),
"/Users/Admin/Downloads/", "Cloud Clutter Data (*.ccd)");
m_cloudData.setPolyVector(m_polygon);
m_cloudData.setPathPointVector(m_pathPointVector);
m_cloudData.setSuppPointVector(m_supPointVector);
m_cloudData.save(filename);
}

最佳答案

我相信这条线:

out << this;

在 save() 方法中应该是:

out << *this;

<< 运算符作用于对类的引用,而不是指向类的指针。

下面的测试代码说明了这一点:

#include <QFile>
#include <QTextStream>
#include <QDebug>

class StreamTest
{
public:
StreamTest() { var1 = "var1"; var2 = "var2"; }
QString var1;
QString var2;

friend QTextStream& operator <<(QTextStream &textStream, const StreamTest &st)
{
textStream << st.var1 << st.var2;
return textStream;
}

void save(void)
{
QString str_1;
QTextStream text_stream_1(&str_1);
text_stream_1 << this;
qDebug() << str_1;

QString str_2;
QTextStream text_stream_2(&str_2);
text_stream_2 << *this;
qDebug() << str_2;
}
};

int main(int argc, char *argv[])
{
StreamTest st;
st.save();
}

运行代码生成输出:

"0x7fff18070c10"
"var1var2"

这会打印指针值,而*这会打印所需的输出。

关于c++ - QDataStream 中的序列化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22521644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com