QFileDialog中如何选择多个文件和文件夹?

14 投票
2 回答
12953 浏览
提问于 2025-04-16 20:19

我正在使用pyQt4,想在我的图形界面中添加一个“浏览”按钮,这个按钮可以打开一个对话框,让用户选择多个文件文件夹。

我查了很多资料,但没有找到可以实现这个功能的方法。

QFileDialog.getOpenFileNames()只能让我选择文件,而QFileDialog.getExistingDirectory()只能让我选择文件夹。

有没有办法把这两个功能结合起来呢?理想情况下,我希望能使用原生对话框,但这似乎不可行。因此,我愿意在外观上做一些妥协。有没有办法实现我想要的功能呢?

这个问题在这里也被问过,但答案是用c++写的。我需要的是python的实现。允许用户在QFileDialog中选择文件或文件夹

2 个回答

2

在Qt5中,你可以简单地使用

return QtWidgets.QFileDialog.getOpenFileNames(self, title, directory, filter=filterFile)
11

这里有个小技巧可以试试:你可以创建一个QFileDialog的子类,这样就能把“打开”按钮的功能断开,然后把它连接到你自己定义的一个函数上。不过要注意,这个方法在不同版本的Qt上可能不一定有效,因为它依赖于找到一些特定的子控件,而这些控件可能会在某些时候被重新配置。

class FileDialog(QtGui.QFileDialog):
    def __init__(self, *args):
        QtGui.QFileDialog.__init__(self, *args)
        self.setOption(self.DontUseNativeDialog, True)
        self.setFileMode(self.ExistingFiles)
        btns = self.findChildren(QtGui.QPushButton)
        self.openBtn = [x for x in btns if 'open' in str(x.text()).lower()][0]
        self.openBtn.clicked.disconnect()
        self.openBtn.clicked.connect(self.openClicked)
        self.tree = self.findChild(QtGui.QTreeView)

    def openClicked(self):
        inds = self.tree.selectionModel().selectedIndexes()
        files = []
        for i in inds:
            if i.column() == 0:
                files.append(os.path.join(str(self.directory().absolutePath()),str(i.data().toString())))
        self.selectedFiles = files
        self.hide()

    def filesSelected(self):
        return self.selectedFiles

撰写回答