14

我正在使用 pyQt4 并希望在我的 GUI 中有一个浏览按钮,它会打开一个对话框,允许用户选择多个文件文件夹。我已经研究了很多,但找不到任何方法可以做到这一点。

QFileDialog.getOpenFileNames() 只允许我选择文件, QFileDialog.getExistingDirectory() 只允许选择目录。

有什么办法可以以某种方式结合它们的功能。理想情况下,我想使用 nativeDialogs 但这似乎是不可能的。因此,我愿意在外观上妥协。有什么办法可以实现所说的吗?

这里也提出了同样的问题,但答案是在 c++ 中。我需要一个python实现。 允许用户在 QFileDialog 中选择文件或文件夹

4

2 回答 2

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
于 2011-07-05T16:26:43.123 回答
2

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

return QtWidgets.QFileDialog.getOpenFileNames(self, title, directory, filter=filterFile)
于 2018-01-02T08:55:27.150 回答