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); } } }
关键逻辑说明
canFetchMore(it):检查目标索引是否还有未加载的子项,对于未展开的目录,这个方法会返回truefetchMore(it):触发模型同步读取目标目录的一级子项数据,更新模型内部的缓存,执行后rowCount(it)就能返回正确的子项数量isDir(it):过滤掉文件索引,因为文件没有子项,无需处理
额外注意事项
fetchMore只会加载一级子项,不会递归加载深层目录,完全符合你获取当前目录内文件列表的需求- 这个加载操作是同步的,调用后立即可以获取子项数据,不需要额外等待信号或者异步处理
内容的提问来源于stack exchange,提问作者Jan Müller
相关产品推荐
相关产品推荐

