文件保存树形结构数据(二)

2014-11-23 21:46:34 · 作者: · 浏览: 21
ndex = -1;
for (int i = 0; i < dataVec.size(); ++i)
{
if (dataVec[i] == pItem)
{
index = i;
break;
}
}
return index;
}
数据模型
TreeDataModel的底层数据就是上面定义的DataItem。用这种视图/模型的 编程方式可以尽量减少数据与界面的耦合性。由于继承了QAbstractItemModel。所以必须重写其中的五个纯虚函数columnCount (),data(),index (),parent ()和rowCount()。
[cpp]
class TreeDataModel:public QAbstractItemModel
{
Q_OBJECT
public:
TreeDataModel(QObject *parent = NULL);
~TreeDataModel();
void SetRoot(DataItem *pRoot)
{
m_pTreeData = pRoot;
}
QModelIndex parent ( const QModelIndex & index ) const;
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const ;
QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
QModelIndex index ( int row, int column, const QModelIndex & parent = QModelIndex() ) const;
int columnCount ( const QModelIndex & parent = QModelIndex() ) const;
int rowCount ( const QModelIndex & parent = QModelIndex() ) const;
DataItem* dataFromIndex(const QModelIndex &index) const;
void SaveData(QDataStream &out);
void LoadData(QDataStream &in);
protected:
private:
DataItem *m_pTreeData;
};
[cpp]
TreeDataModel::TreeDataModel( QObject *parent /*= NULL*/ ):QAbstractItemModel(parent)
{
m_pTreeData = NULL;
}
TreeDataModel::~TreeDataModel()
{
}
QVariant TreeDataModel::data( const QModelIndex & index, int role /*= Qt::DisplayRole */ ) const
{
DataItem *pItem = dataFromIndex(index);
if ((pItem)&&(role == Qt::DisplayRole))
{
switch (index.column())
{
case 0:
return pItem->GetID();
case 1:
return pItem->GetName();
}
}
return QVariant();
}
QVariant TreeDataModel::headerData( int section, Qt::Orientation orientation, int role /*= Qt::DisplayRole */ ) const
{
if ((section <2) && (orientation == Qt::Horizontal)&& (role == Qt::DisplayRole))
{
switch (section)
{
case 0:
return tr("编号");
case 1:
return tr("名称");
default:
return QVariant();
}
}
else
{
return QVariant();
}
}
QModelIndex TreeDataModel::index( int row, int column, const QModelIndex & parent /*= QModelIndex() */ ) const
{
if (!m_pTreeData ||row < 0 || column < 0)
{
return QModelIndex();
}
else
{
DataItem *pItem = dataFromIndex(parent);
if (pItem)
{
DataItem *pChild = pItem->GetItem(row);
if (pChild)
{
return createIndex(row,column,pChild);
}
}
return QModelIndex();
}
}
int TreeDataModel::columnCount( const QModelIndex & parent /*= QModelIndex() */ ) const
{
return 2;
}
int TreeDataModel::rowCount( const QModelIndex & parent /*= QModelIndex() */ ) const
{
DataItem *pItem = dataFromIndex(parent);
if (pItem)
{
return pItem->GetSize();
}
return 0;
}
DataItem* TreeDataModel::dataFromIndex( const QModelIndex &index ) const
{
if (index.isValid())
{
return st