在QFileDialog pyqt5中选择文件或文件夹

2024-10-03 04:30:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我的纸条列表当前使用qtwidts.QFileDialog.getOpenFileNames()让用户在Windows资源管理器中选择文件。现在我想知道是否有办法让他们也选择文件夹,而不仅仅是文件。有一些类似的帖子,但没有一个能提供有效的解决方案。我真的不想使用QFileDialog文件资源管理器来解决这个问题


Tags: 文件用户文件夹列表windows解决方案帖子资源管理
1条回答
网友
1楼 · 发布于 2024-10-03 04:30:07

QFileDialog本机不允许这样做。唯一的解决方案是创建自己的实例,进行一些小的“修补”

请注意,为了实现这一点,您不能使用操作系统的本机对话框,因为Qt几乎可以控制它们;这就是dialog.DontUseNativeDialog标志的原因,它是强制性的

下面的代码与静态方法一样工作,并返回所选项目(如果对话框被取消,则返回无)

def getOpenFilesAndDirs(parent=None, caption='', directory='', 
                        filter='', initialFilter='', options=None):
    def updateText():
        # update the contents of the line edit widget with the selected files
        selected = []
        for index in view.selectionModel().selectedRows():
            selected.append('"{}"'.format(index.data()))
        lineEdit.setText(' '.join(selected))

    dialog = QtWidgets.QFileDialog(parent, windowTitle=caption)
    dialog.setFileMode(dialog.ExistingFiles)
    if options:
        dialog.setOptions(options)
    dialog.setOption(dialog.DontUseNativeDialog, True)
    if directory:
        dialog.setDirectory(directory)
    if filter:
        dialog.setNameFilter(filter)
        if initialFilter:
            dialog.selectNameFilter(initialFilter)

    # by default, if a directory is opened in file listing mode, 
    # QFileDialog.accept() shows the contents of that directory, but we 
    # need to be able to "open" directories as we can do with files, so we 
    # just override accept() with the default QDialog implementation which 
    # will just return exec_()
    dialog.accept = lambda: QtWidgets.QDialog.accept(dialog)

    # there are many item views in a non-native dialog, but the ones displaying 
    # the actual contents are created inside a QStackedWidget; they are a 
    # QTreeView and a QListView, and the tree is only used when the 
    # viewMode is set to QFileDialog.Details, which is not this case
    stackedWidget = dialog.findChild(QtWidgets.QStackedWidget)
    view = stackedWidget.findChild(QtWidgets.QListView)
    view.selectionModel().selectionChanged.connect(updateText)

    lineEdit = dialog.findChild(QtWidgets.QLineEdit)
    # clear the line edit contents whenever the current directory changes
    dialog.directoryEntered.connect(lambda: lineEdit.setText(''))

    dialog.exec_()
    return dialog.selectedFiles()

相关问题 更多 >