You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt TreeView统计已展开可导航行总数(含文件夹展开折叠逻辑)

解决Qt TreeView统计已展开可导航行总数的问题

我来帮你搞定这个需求——要统计TreeView中所有已展开且可访问的行(折叠文件夹的子项不算),关键是要结合QTreeView的展开状态来控制递归逻辑,而不是盲目遍历模型的所有索引。

有效实现方案

这里提供一个递归函数,专门根据TreeView的展开状态统计符合要求的行数:

int MainWindow::countExpandedRows(QTreeView* treeView, const QModelIndex& parentIndex) {
    int count = 0;
    const QAbstractItemModel* model = treeView->model();
    int childCount = model->rowCount(parentIndex);
    
    // 先统计当前父节点下的直接子项数量
    count += childCount;

    // 遍历每个子项,仅当子项处于展开状态时,递归统计它的子项
    for (int r = 0; r < childCount; ++r) {
        QModelIndex childIndex = model->index(r, 0, parentIndex);
        if (treeView->isExpanded(childIndex)) {
            count += countExpandedRows(treeView, childIndex);
        }
    }
    return count;
}

调用方式

如果要统计整个TreeView的所有已展开行,直接传入根节点的父索引(空QModelIndex)即可:

int totalRows = countExpandedRows(ui->treeView, QModelIndex());

为什么之前的方案无效?

  • 方案一:完全没有考虑TreeView的展开状态,不管文件夹是折叠还是展开,都会递归统计所有子项,自然不符合你的需求。
  • 方案二:仅能获取当前选中项父节点的直接子项数,既没有递归逻辑,也不判断展开状态,无法覆盖所有已展开的层级。

注意事项

  • 这个方法依赖QTreeView::isExpanded(),它是View层面的状态,和模型无关,所以不管你用的是QFileSystemModel还是自定义模型,只要是TreeView展示的结构都适用。
  • 当TreeView的展开/折叠状态变化时,需要重新调用这个函数来更新统计结果。

内容的提问来源于stack exchange,提问作者mozcelikors

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:57:31