PyQt5 QFileDialog.getExistingDirectory无法访问~/.config子目录原因?
解决PyQt5中QFileDialog无法定位到~/.config/autostart目录的问题
我之前在Linux下用PyQt5开发时也踩过类似的坑,这问题根本不是权限的锅,而是Qt的文件对话框在处理XDG规范的特殊目录时的“小脾气”——比如.config/autostart这类系统定义的特殊目录,Qt默认调用的原生系统文件对话框(比如GTK的文件管理器)会把它们识别为特殊位置,不会直接跳进去,反而会自动回退到用户主目录~/。
而你用os.system("ls")能正常访问,是因为系统命令直接操作文件系统,不会受原生对话框的特殊逻辑影响;同理~/.config本身不是被标记为“特殊入口”的目录,~/Documents/Volunteer是普通用户目录,所以都能正常跳转。
快速解决方案:强制使用Qt自带的非原生对话框
只需要给getExistingDirectory加上DontUseNativeDialog选项,让Qt用自己实现的文件对话框,就能绕过原生对话框的特殊处理,正常定位到指定目录:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Arch Linux (up-to-date) # Python 3.6.5 # python-pyqt5 5.10.1-3 import os import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * app = QApplication(sys.argv) # 现在可以正常定位到~/.config/autostart了 wd = os.path.expanduser("~/.config/autostart") os.system("ls {0}".format(wd)) x = QFileDialog.getExistingDirectory( caption="Choose presets...", directory=wd, options=QFileDialog.DontUseNativeDialog # 关键参数 ) # 原有的正常代码不受影响 wd = os.path.expanduser("~/.config") x = QFileDialog.getExistingDirectory(caption="Choose presets...", directory=wd) wd = os.path.expanduser("~/Documents/Volunteer") x = QFileDialog.getExistingDirectory(None, "Choose presets...", wd)
补充说明
如果坚持想用原生对话框,那只能先打开~/.config目录,让用户手动点击进入autostart,但体验不如直接用Qt自带对话框来得顺畅。这个问题本质是Linux桌面环境的原生文件管理器对XDG特殊目录的归类逻辑,和Qt的默认调用行为冲突导致的,强制使用Qt自带对话框是最直接的解决方式。
内容的提问来源于stack exchange,提问作者Ubuntourist




