You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动