本文主要研究了一下如何把树形结构的数据保存到文件并读取出来。为了更形象说明用了一个界面程序显示,程序用了model/view框架。
数据类
DataItem 就是保存在树形结构的基本数据。其最重要的保存数据的函数是SerialzeData
class DataItem
{
public:
DataItem(int id = 100,QString name = "root");
~DataItem();
void SetRoot(DataItem *root);
void SerialzeData(bool isSave,QDataStream &stream);
void Clear();
void Init();
//protected:
int GetID()
{
return ID;
}
QString GetName()
{
return Name;
}
void SetID(int id)
{
ID = id;
}
void SetName(QString name)
{
Name = name;
}
int GetSize()
{
return dataVec.size();
}
void AddItem(DataItem *pItem);
void DeleteItem(DataItem *pItem);
void DeleteItem(int index);
DataItem *GetItem(int index);
DataItem *GetParent()
{
return pRoot;
}
int indexOf(DataItem* pItem);
private:
int ID;
QString Name;
vector<DataItem*> dataVec;
DataItem *pRoot;
};
DataItem::DataItem( int id,QString name ):ID(id),Name(name),pRoot(NULL)
{
//pRoot = new DataItem(100,"Root");
}
DataItem::~DataItem()
{
}
//SerialzeData 原来是,保存数据时,先保存每个项的数据,在后面保存该项的子节点个数,并递归保存各个子节点数据
void DataItem::SerialzeData( bool isSave,QDataStream &stream )
{
if (isSave)
{
stream<<GetID()<<GetName(); //save ID and Name
stream<<dataVec.size(); //save the number of child
for(int i = 0; i < dataVec.size(); ++i)
{
dataVec[i]->SerialzeData(isSave,stream);
}
}
else
{
int id;
int size;
QString name;
stream>>id>>name; //Get ID and Name
SetID(id);
SetName(name);
stream>>size; //Get the number of child
for(int i = 0; i < size; ++i)
{
DataItem *pItem = new DataItem(0,"name");
pItem->SerialzeData(isSave,stream);
AddItem(pItem);
}
}
}
void DataItem::AddItem( DataItem *pItem )
{
pItem->SetRoot(this);
dataVec.push_back(pItem);
}
void DataItem::DeleteItem( DataItem *pItem )
{
vector<DataItem*>::iterator it = dataVec.begin();
for (it; it != dataVec.end(); ++it)
{
if (*it == pItem)
{
dataVec.erase(it);
break;
}
}
}
void DataItem::DeleteItem( int index )
{
if (index < dataVec.size())
{
vector<DataItem*>::iterator it = dataVec.begin();
it = it + index;
dataVec.erase(it);
}
}
void DataItem::Init()
{