【问题标题】:PyQt - QFileDialog - directly browse to a folder?PyQt - QFileDialog - 直接浏览到文件夹?
【发布时间】:2016-08-03 14:09:10
【问题描述】:

有没有什么方法可以直接使用 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)

【问题讨论】:

    标签: python qt pyqt qfiledialog


    【解决方案1】:

    如果您使用静态QFileDialog 函数,您将获得一个native 文件对话框,因此您将受限于平台提供的功能。您可以查阅适用于您平台的文档,以查看您想要的功能是否可用。

    如果它不可用,您将不得不接受 Qt 的 内置 文件对话框,并添加您自己的功能。对于您的特定用例,这应该很容易,因为内置对话框似乎已经拥有您想要的东西。它有一个side-bar,显示用户可以直接导航到的“地点”列表。您可以像这样设置自己的位置:

    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 肯定有帮助。谢谢!
    【解决方案2】:

    这是一个方便的功能,用于快速打开/保存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 模块是什么?
    【解决方案3】:

    改用getExistingDirectory 方法:

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

    【讨论】:

    • 正确(现在才注意到)。唯一的区别是 PyQt 版本(4 vs 5)
    【解决方案4】:

    PyQt 4 中,您只需添加QFileDialog 即可构建一个窗口,该窗口在对话框中嵌入了路径文本字段。您可以在此处粘贴您的路径。

    QtGui.QFileDialog.getOpenFileName(self, 'Select file')  # For file.
    

    选择目录:

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

    每个都有一个路径文本字段

    【讨论】:

    • 由于某种原因这对我不起作用..使用:QtGui.QFileDialog.getOpenFileName(self, "Load File", filter)。我没有得到那个路径文本字段。 filter 是我为选择特定类型的文件而创建的这样一个字符串。
    • 就像我在下面提到的,如果我将 QFileDialog 设置为打开目录,然后在出现的默认路径文本字段中输入目录路径,它只会选择该文件夹并返回,它不会导航到它并“停留”在那里。
    • 或许贴一张你的对话截图和完整代码?
    【解决方案5】:

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

     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()
    

    【讨论】:

    • 谢谢,但这并不是我真正想要的。我的意思是我想让用户在文件对话框之后导航到一个特定的目录(而不是一直双击它)已经打开了。
    • 不确定我是否理解正确,getOpenFileName 已经包含一个导航栏,您可以在其中直接键入路径,而无需使用鼠标,这是您想要的吗?
    • 是的,但是如果我将 QFileDialog 设置为打开目录,然后输入目录路径,它只会选择它并返回,而不导航到它并“停留”在那里。
    • 嗯,我已经在 Windows 上尝试了 getOpenFileName 和 getExistingDirectory,一旦我在导航栏中输入我的路径并按 Enter,它不会关闭对话框并停留在那里。也许在 MacOsX 上这不是默认行为
    • 奇怪..也许真的不是。
    猜你喜欢
    • 2011-06-13
    • 2017-05-04
    • 1970-01-01
    • 2019-09-26
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2011-12-19
    相关资源
    最近更新 更多