сделал через хеш. при загрузке индексация рута с рекурсией для дочерних узлов (сохраняем в хеш пары id-index). При вставке в узел переиндексирую родительский узел. При удалении в узле - удаляю из хеша (включая дочерние элементы) и переиндексирую родительский узел.
Индексация узла у меня такая:
C++ (Qt)
void ToIndexNode(const QModelIndex &parent,bool withChilds)
{
const int childsCount = rowCount(parent);
for (int i=0;i<childsCount;i++)
{
QModelIndex childIndex = index(i,0,parent);
IdType childId = GetId(childIndex);
_indexes.insert(childId,childIndex);
if (withChilds)
{
ToIndexNode(childIndex,withChilds);
}
}
}