PyQt - QFileDialog - 直接浏览到文件夹?

12

有没有办法在QFileDialog中直接浏览到一个文件夹?

也就是说,不需要在导航到目标文件夹时双击每个文件夹,只需在某处输入路径或使用像Mac OS X的Finder中的Shift+Command+G这样的热键即可。

谢谢!

编辑:(我的代码)

    filter = "Wav File (*.wav)"
    self._audio_file = QtGui.QFileDialog.getOpenFileName(self, "Audio File",
                                                        "/myfolder/folder", filter)
    self._audio_file = str(self._audio_file)
5个回答

10
这是一个方便的函数,用于快速创建打开/保存 QFileDialog
from PyQt5.QtWidgets import QFileDialog, QDialog
from definitions import ROOT_DIR
from PyQt5 import QtCore


def FileDialog(directory='', forOpen=True, fmt='', isFolder=False):
    options = QFileDialog.Options()
    options |= QFileDialog.DontUseNativeDialog
    options |= QFileDialog.DontUseCustomDirectoryIcons
    dialog = QFileDialog()
    dialog.setOptions(options)

    dialog.setFilter(dialog.filter() | QtCore.QDir.Hidden)

    # ARE WE TALKING ABOUT FILES OR FOLDERS
    if isFolder:
        dialog.setFileMode(QFileDialog.DirectoryOnly)
    else:
        dialog.setFileMode(QFileDialog.AnyFile)
    # OPENING OR SAVING
    dialog.setAcceptMode(QFileDialog.AcceptOpen) if forOpen else dialog.setAcceptMode(QFileDialog.AcceptSave)

    # SET FORMAT, IF SPECIFIED
    if fmt != '' and isFolder is False:
        dialog.setDefaultSuffix(fmt)
        dialog.setNameFilters([f'{fmt} (*.{fmt})'])

    # SET THE STARTING DIRECTORY
    if directory != '':
        dialog.setDirectory(str(directory))
    else:
        dialog.setDirectory(str(ROOT_DIR))


    if dialog.exec_() == QDialog.Accepted:
        path = dialog.selectedFiles()[0]  # returns a list
        return path
    else:
        return ''

ROOT_DIR是否等于os.path.abspath(__file__)?那个definitions模块是什么? - gabriel garcia

9
如果您使用静态的QFileDialog函数,您将会得到一个本地的文件对话框,因此您将被限制在平台提供的功能范围内。您可以查看您所使用平台的文档,以确定您想要的功能是否可用。
如果不可用,则必须使用Qt的内置文件对话框,并添加自己的功能。对于您特定的用例,这应该很容易,因为内置对话框似乎已经具备了您所需的功能。它有一个侧边栏,显示用户可以直接导航到的“位置”列表。您可以像这样设置自己的位置:
dialog = QtGui.QFileDialog(self, 'Audio Files', directory, filter)
dialog.setFileMode(QtGui.QFileDialog.DirectoryOnly)
dialog.setSidebarUrls([QtCore.QUrl.fromLocalFile(place)])
if dialog.exec_() == QtGui.QDialog.Accepted:
    self._audio_file = dialog.selectedFiles()[0]

太好了,Sidebar 的东西确实有帮助。谢谢! - YaronGh

8
请使用getExistingDirectory方法代替:

from PyQt5.QtWidgets import QFileDialog

dialog = QFileDialog()
foo_dir = dialog.getExistingDirectory(self, 'Select an awesome directory')
print(foo_dir)

刚刚注意到,唯一的区别就是PyQt版本(4与5)。 - Oscar Lima

3
PyQt 4中,您可以添加一个QFileDialog来构建一个具有嵌入式路径文本字段的窗口。您可以在此处粘贴您的路径。
QtGui.QFileDialog.getOpenFileName(self, 'Select file')  # For file.

选择目录:

QtGui.QFileDialog.getExistingDirectory(self, 'Select directory')

每个都将具有一个路径文本字段: enter image description here

因为某种原因,使用QtGui.QFileDialog.getOpenFileName(self, "Load File", filter)对我没有起作用。我得不到那个路径文本框。filter是一个我创建的字符串,用于选择特定类型的文件。 - YaronGh
就像我下面提到的那样,如果我将我的QFileDialog设置为打开目录,并在默认路径文本字段中输入目录路径,则它只会选择该文件夹并返回,而不是导航到该文件夹并“停留”在那里。 - YaronGh
可以发一下你的对话框截图和完整代码吗? - ospahiu

0

下面是一个简单的测试,它直接打开了对话框,并显示了特定路径。在这种情况下,路径为当前工作目录。如果您想要直接打开另一个路径,您可以使用Python的os.path模块中包含的目录函数:

 import sys
 import os
 from PyQt4 import QtGui


 def test():
      filename = QtGui.QFileDialog.getOpenFileName(
           None, 'Test Dialog', os.getcwd(), 'All Files(*.*)')

 def main():
     app = QtGui.QApplication(sys.argv)

     test()

     sys.exit(app.exec_())

 if __name__ == "__main__":
     main()

谢谢但这不是我真正想要的...我的意思是,我想在文件对话框已经打开后,让用户导航到特定目录(而不是一路双击进去)。 - YaronGh
我不确定我是否理解正确,getOpenFileName已经包括了一个导航栏,在那里你可以直接键入路径而无需使用鼠标,这是你想要的吗? - BPL
是的,但如果我将我的 QFileDialog 设置为打开目录,然后输入一个目录路径,它只会选择它并返回,而不会导航到它,并停留在那里。 - YaronGh
嗯,我在 Windows 上尝试了 getOpenFileName 和 getExistingDirectory 两种函数,但是当我在导航栏中输入路径并按下回车键时,它没有关闭对话框而是一直停留在那里。也许在 MacOSX 上这不是默认行为。 - BPL
奇怪..也许它真的不是。 - YaronGh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接