【发布时间】:2014-01-17 12:48:40
【问题描述】:
我有一个 ContactData 类和一个持有 QList 的 FriendList 类,我重载了 > 运算符。
contactdata.h
class ContactData
{
//all public for testing
public:
ContactData();
QString m_name;
QString m_description;
bool m_online;
};
QDataStream &operator<<(QDataStream& out, ContactData& contactData);
QDataStream &operator>>(QDataStream& in, ContactData* contactData);
contactdata.cpp
QDataStream &operator<<(QDataStream &out, ContactData& contactData)
{
out << contactData.m_name;
out << contactData.m_description;
return out;
}
QDataStream &operator>>(QDataStream &in, ContactData* contactData)
{
in >> contactData->m_name;
in >> contactData->m_description;
return in;
}
friendlist.h
#include "contactdata.h"
typedef QList<ContactData*> TFriendList;
class FriendList
{
...
public:
TFriendList* m_list;
...
};
QDataStream &operator<<(QDataStream& out, FriendList& list);
QDataStream &operator>>(QDataStream& in, FriendList* list);
friendlist.cpp
QDataStream &operator<<(QDataStream& out, FriendList& list)
{
for(int i = 0; i < list.size(); i++)
{
ContactData contact = *list.at(i);
out << contact;
}
return out;
}
QDataStream &operator>>(QDataStream& in, FriendList* list)
{
for(int i = 0; i < list->size(); i++)
{
ContactData* contact = list->m_list->at(i);
in >> contact;
}
return in;
}
// typedef QList<ContactData*> TFriendList;
private:
FriendList* m_friendList;
保存功能
QString path = "/friendlist.bin";
QFile file(path);
if (file.open(QIODevice::WriteOnly))
{
QDataStream out(&file);
out << m_friendList;
file.close();
}
加载函数
QString path = "/friendlist.bin";
QFile file(path);
if(file.exists())
{
if (file.open(QIODevice::ReadOnly))
{
QDataStream in(&file);
in >> m_friendList;
file.close();
qDebug() << "FriendList.size() = " << m_friendList->size();
}
}
它确实将文件保存在所需的方向,但不幸的是,加载给了我一个大小为 0 的空列表。 这就是我卡住的地方..
谁能帮忙?
【问题讨论】:
-
从您的代码中: for(int i = 0; i size(); i++) 反序列化列表本身。当列表为空(并且您想加载它)时, size() 将返回 0 ,因此不会反序列化任何内容。您必须(尝试)反序列化直到流结束(或在开始时写入列表大小)。
-
您的代码中有错误。您的 FriendList & 但您提供
FriendList *
标签: c++ qt qlist qdatastream