Вы можете проверить свое представление, расширен ли каждый индекс или нет. Тогда это всего лишь вопрос прохождения модели.
Кредит Кубы Заказ:
Как зациклить индексы QAbstractItemView?
На основании его приятной функции обхода:
void iterate(const QModelIndex & index, const QAbstractItemModel * model,
const std::function<void(const QModelIndex&, int)> & fun,
int depth = 0)
{
if (index.isValid())
fun(index, depth);
if (!model->hasChildren(index)) return;
auto rows = model->rowCount(index);
auto cols = model->columnCount(index);
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
iterate(model->index(i, j, index), model, fun, depth+1);
}
, вы можете легко написать свою потребность:
int countExpandedNode(QTreeView * view) {
int totalExpanded = 0;
iterate(view->rootIndex(), view->model(), [&totalExpanded,view](const QModelIndex & idx, int depth){
if (view->isExpanded(idx))
totalExpanded++;
});
return totalExpanded;
}
код вызова такой:
QTreeView view;
view.setModel(&model);
view.setWindowTitle(QObject::tr("Simple Tree Model"));
view.expandAll();
view.show();
qDebug() << "total expanded" << countExpandedNode(&view);
Я быстро протестировал его на примере Qt TreeModel, похоже, он работает.