TreeModel和QStringListModel、QSqlTableModel等不同,后者是维护一个model实例,数据(可理解为)直接初始化到model中,而demo中的TreeModel是创建并维护一个树结构TreeItem的实例,在TreeModel::setModelData中对结点进行parent->insertChildren操作。
demo中的TreeItem是树结构,每一个结点中存储的数据,与View及Model中设计的item的结构相符,但并不是类似QTableWidget中的一个QTableWidgetItem对象。
===========================================
TreeModel::setModelData执行完,便初始化完成了一个以rootItem为根结点的树结构。(图中忽略Column #1)
===========================================
TreeModel中,在实现index(r,c,parent)时,先将rootItem与QModelIndex()关联,再利用桥接关系parentItem = getItem(r,c,parent),childItem = parentItem->child(r),建立index与结点之间的内联index = createIndex(r,c,childItem)。之后,其他成员便可直接调用getItem(r,c,index),通过QModelIndex::internalPointer获得index内联的childItem。
QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const
{
if (parent.isValid() && parent.column() != 0)
return QModelIndex();
//! [5]
//! [6]
TreeItem *parentItem = getItem(parent);
TreeItem *childItem = parentItem->child(row);
if (childItem)
return createIndex(row, column, childItem);
else
return QModelIndex();
}
TreeItem *TreeModel::getItem(const QModelIndex &index) const
{
if (index.isValid()) {
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
if (item)
return item;
}
return rootItem;
}
===========================================
demo截图