You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu20.04下PyQt5的ShowDirsOnly选项失效问题求助

解决PyQt5中QFileDialog.ShowDirsOnly在Ubuntu20.04不生效的问题

问题原因

Ubuntu 20.04默认使用GTK风格的系统原生文件对话框,Qt的ShowDirsOnly选项对这类对话框不生效——系统对话框会忽略Qt的部分参数设置。

解决方案

方法1:强制使用Qt原生对话框

在调用getExistingDirectory时,添加QtWidgets.QFileDialog.DontUseNativeDialog选项,强制启用Qt自身实现的对话框,这样ShowDirsOnly就能正常生效:

import sys,os
from PyQt5 import QtWidgets

def button_pressed():
    folder = QtWidgets.QFileDialog.getExistingDirectory(None, "Select folder",
            os.getcwd(),
            QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog) 

    print(folder)

def window():
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QWidget()
    w.setWindowTitle("Test")
 
    b = QtWidgets.QPushButton(w)
    b.setText("Select folder")
    b.pressed.connect(button_pressed)

    w.show()
 
    sys.exit(app.exec_())

if __name__ == '__main__':
    window()

方法2:保留系统对话框的兼容处理(可选)

如果希望保留系统原生对话框的风格,其实getExistingDirectory本身就限制了只能选择文件夹,只是界面上可能会显示文件但无法选中。如果需要更严格的校验,可以在获取路径后手动判断:

def button_pressed():
    folder = QtWidgets.QFileDialog.getExistingDirectory(None, "Select folder", os.getcwd())
    if os.path.isdir(folder):
        print(folder)
    else:
        print("请选择有效的文件夹")

补充说明

使用DontUseNativeDialog后,对话框外观可能和系统风格略有差异,但能确保Qt的所有参数选项正常工作;若优先考虑系统风格一致性,直接使用默认的系统对话框即可,因为它本身不会允许用户选中文件。

内容的提问来源于stack exchange,提问作者user559678

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:39:20