Ну рекурсивный цикл будет не по всем индексам, а только по тем, у который родитель раскрыт.
Если нет сортировок и фильтров, храни в элементе кто из его детей открыт по номеру строки. Т.е. применяешь функцию к корню - получаешь список раскрытых итемов, затем берешь поочередно потомков и используешь функцию для них. Если список пуст - выход из рекурсии.
Я как-то так себе это представляю
class TreeItem
{
TreeItem *parent;
QVariant value;
QList<TreeItem *> children;
TreeItem *childAt(int row) {return children.at(row)};
QList<int> expandedChildren;
...
}
QList<int> MyTreeModel::expandedChildren(const QModelIndex &index)
{
return itemAt(index)->expandedChildren();
}
...
void MyWidget::restoreExpanding(const QModelIndex &item)
{
for(int i=0;i<model->rowCount(item),++i)
{
QModelIndex index= model->index(i,0,item);
QList<int> list = model->expandedChildren(index);
for(int j=0;j<list.size();++j)
{
restoreExpanding(itemAt(index));
view->setExpanded(index);
}
}
}
MyWidget::MyWidget(): ...
{
...
restoreExpanding(model->rootItem());
}