设为首页 加入收藏

TOP

文件保存树形结构数据(一)
2014-11-23 21:46:34 来源: 作者: 【 】 浏览:15
Tags:文件 保存 树形 结构 数据
本文主要研究了一下如何把树形结构的数据保存到文件并读取出来。为了更形象说明用了一个界面程序显示,程序用了model/view框架。
数据类
DataItem 就是保存在树形结构的基本数据。其最重要的保存数据的函数是SerialzeData
[cpp]
{
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 dataVec;
DataItem *pRoot;
};
[cpp]
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<
stream<
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::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::iterator it = dataVec.begin();
it = it + index;
dataVec.erase(it);
}
}
void DataItem::Init()
{
for (int i = 0; i < 5; ++i)
{
DataItem *pItem = new DataItem(i,QString("child%1").arg(i));
pRoot->AddItem(pItem);
for (int j = 0; j < 2; ++j)
{
DataItem *pChild = new DataItem(j,QString("grandchild%0 -%1").arg(i).arg(j));
pItem->AddItem(pChild);
}
}
}
void DataItem::SetRoot( DataItem *root )
{
pRoot = root;
}
void DataItem::Clear()
{
dataVec.clear();
}
DataItem * DataItem::GetItem( int index )
{
if (index < dataVec.size())
{
return dataVec[index];
}
else
{
return NULL;
}
}
int DataItem::indexOf( DataItem* pItem )
{
int i
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇 FZU-1921+线段树 下一篇HDU 1506 Largest Rectangle in a..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·一篇说人话的文章, (2025-12-27 07:50:09)
·Python Web框架哪家 (2025-12-27 07:50:06)
·基于Python的数据分 (2025-12-27 07:50:03)
·深入理解 Java 集合 (2025-12-27 07:22:48)
·Java集合框架全面解 (2025-12-27 07:22:45)