PyQt5调用QFileDialog.getExistingDirectory运行时卡住调试正常是什么原因
问题原因
- 这是PyQt5 5.15.x版本在Windows 10平台上的已知兼容性问题,触发根源是
QFileDialog默认调用Windows原生目录选择对话框时,会扫描系统的快速访问、网络映射盘、外接存储等位置,如果存在失效的网络映射、未正常卸载的断开外接设备,扫描过程就会陷入无响应。 - 调试模式下运行正常是因为PyCharm的调试钩子会修改Qt事件循环的调度逻辑,跳过了原生对话框的部分系统扫描步骤,所以不会触发卡住的问题。
__init__方法中调用可以正常运行是因为执行该方法时主窗口还未完成渲染,Qt主事件循环尚未启动,原生对话框的挂载上下文不同,不会触发扫描bug。
解决方案
优先推荐:禁用原生对话框
在调用getExistingDirectory时添加DontUseNativeDialog参数,强制使用Qt自带的文件对话框,可100%规避该类系统兼容性问题:
path = QtWidgets.QFileDialog.getExistingDirectory( self, 'select directory', directory='C:\\', options=QtWidgets.QFileDialog.DontUseNativeDialog )
其他可选方案
- 检查Windows系统的「此电脑」中是否存在失效的网络映射驱动器,删除失效的映射即可解决原生对话框卡住的问题
- 降级PyQt5版本到5.12.x系列,该版本的原生文件对话框在Win10平台兼容性更好
- 不要将默认打开目录设置为磁盘根目录,修改为用户目录等路径可减少扫描范围,降低卡住概率:
import os path = QtWidgets.QFileDialog.getExistingDirectory( self, 'select directory', directory=os.path.expanduser("~") )
内容的提问来源于stack exchange,提问作者EdShLo
相关产品推荐
相关产品推荐

