QFileDialog中如何选择多个文件和文件夹?
我正在使用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