Windows 10下使用QFileDialog如何开启网络位置等非本地资源的访问权限?
问题解决:Qt 5.9.2 QFileDialog 无法访问Windows 10网络等非本地资源的处理方案
问题原因
Qt 5.9.2默认使用Qt自绘的文件对话框,该实现没有适配Windows系统的扩展资源条目,因此只会显示本地磁盘、用户文件夹等基础本地资源,无法加载网络位置、系统库、云盘等资源管理器中可见的条目,属于Qt旧版本的已知特性。
解决方法
方案1:强制使用系统原生文件对话框(优先推荐)
该方案可以完全复用Windows资源管理器的所有能力,所有在资源管理器中可见的条目(包括网络、共享文件夹、OneDrive、系统库等)都可以正常访问,操作方式如下:
调用QFileDialog时显式关闭DontUseNativeDialog选项即可:
- 如果你使用QFileDialog的静态方法(比如
getOpenFileName/getSaveFileName),只要不在最后一个参数的选项里传入QFileDialog::DontUseNativeDialog,默认就会调用系统原生对话框。 - 如果你是手动实例化QFileDialog对象,添加如下配置:
QFileDialog dialog; // 关闭Qt自绘选项,启用系统原生对话框 dialog.setOption(QFileDialog::DontUseNativeDialog, false);
如果使用原生对话框后仍无法看到网络资源,确认Windows系统的网络发现功能已开启,且当前运行程序的账户和你使用资源管理器时的账户权限一致即可。
方案2:手动为Qt自绘对话框添加自定义路径
如果你必须使用Qt自绘的对话框样式,可以通过setSidebarUrls方法手动把需要访问的网络等路径添加到侧边栏:
QFileDialog dialog; // 保留原有默认的侧边栏条目 QList<QUrl> sidebarUrls = dialog.sidebarUrls(); // 添加Windows网络位置根目录 sidebarUrls.append(QUrl::fromLocalFile("\\\\network")); // 按需添加你常用的共享文件夹路径,示例: // sidebarUrls.append(QUrl::fromLocalFile("\\\\192.168.1.100\\共享文件夹")); dialog.setSidebarUrls(sidebarUrls);
注意:该方案存在一定兼容性问题,Qt自绘对话框对SMB网络路径的解析、加载速度都不如原生对话框,仅在必须使用自定义对话框样式的场景下使用。
内容的提问来源于stack exchange,提问作者SPlatten
相关产品推荐
相关产品推荐

