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

QFileSystemModel与QTreeView:未展开目录如何获取子文件列表

解决QFileSystemModel未展开目录无法获取子项的问题

你遇到的问题本质是QFileSystemModel的懒加载机制——默认情况下,只有当目录在UI中被展开时,模型才会去读取该目录的子项数据,未展开的目录对应的索引调用rowCount()自然会返回0。要解决这个问题,我们可以手动触发模型加载指定目录的子项,不需要展开UI。

修改后的代码实现

直接在你的selectionChanged方法中添加强制加载的逻辑即可:

void MyModel::selectionChanged(const QItemSelection& selected,const QItemSelection& deselected) {
    for (auto const & it : selected.indexes()) {
        // 先判断当前索引是否为目录,且存在未加载的子项
        if (isDir(it) && canFetchMore(it)) {
            fetchMore(it); // 强制加载该目录的一级子项,无需展开UI
        }
        // 现在rowCount()会返回正确的子项数量
        for (int i=0;i<rowCount(it);i++) {
            auto child = it.child(i, it.column());
            qDebug() << fileName(child);
        }
    }
}

关键逻辑说明

  1. canFetchMore(it):检查目标索引是否还有未加载的子项,对于未展开的目录,这个方法会返回true
  2. fetchMore(it):触发模型同步读取目标目录的一级子项数据,更新模型内部的缓存,执行后rowCount(it)就能返回正确的子项数量
  3. isDir(it):过滤掉文件索引,因为文件没有子项,无需处理

额外注意事项

  • fetchMore只会加载一级子项,不会递归加载深层目录,完全符合你获取当前目录内文件列表的需求
  • 这个加载操作是同步的,调用后立即可以获取子项数据,不需要额外等待信号或者异步处理

内容的提问来源于stack exchange,提问作者Jan Müller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:42:44