QT,[demo]EditableTreeModel中,TreeItem和TreeModel的理解

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截图


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页