【问题标题】:Multiple files AND folder selection in a QFileDialog?QFileDialog中的多个文件和文件夹选择?
【发布时间】:2011-09-23 00:14:12
【问题描述】:

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

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

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

这里也有人问过同样的问题,但答案是用 c++ 编写的。我需要一个python实现。 Allow user to select a file or a folder in QFileDialog

【问题讨论】:

  • 不幸的是,我怀疑答案是否定的。您上面提到的 C++ 答案无效。选项是:1) 向 Qt 开发人员提交一个愿望,2) 编写您自己的文件对话框,3) 自己修复它。如果您能想到一个可以做到这一点的 Qt 项目,那么看看它是如何实现的将会很有趣。

标签: python qt pyqt pyqt4 qfiledialog


【解决方案1】:

这里有一个对你有用的技巧:创建一个 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

【讨论】:

  • 非常感谢!效果很好。但是,我必须更改一条线以使其根据我的需要工作。 files.append(os.path.join(str(self.directory().absolutePath()),str(i.data().toString())))
  • 我面临一个问题,但在文件显示时,对话框中的 Files_name 行编辑中未指示所选目录,尽管 可以 都被选择并成功返回文件选择()。有什么解决方法可以解决这个问题,以避免用户最终感到困惑?
  • 我假设树视图的SelectsModel在选择变化时发出信号,并且该信号被捕获以更新线路中的文本。您可以断开信号并将其重新连接到具有您期望的行为的自定义函数..
  • 我无法让它工作。有人可以提供通话的例子吗?是不是像这样:mylist = FileDialog.getExistingDirectory(self, "Select Files and Folders","", QtGui.QFileDialog.DontConfirmOverwrite)
  • @Luke:我在 C++ 中实现了你的想法,但它不起作用,这意味着 selectedFiles 将返回文件或目录(取决于 ctor 中设置的模式),但不处理两者同时。这里是my snippet。你能指出我做错了什么吗?
【解决方案2】:

在 Qt5 中你可以简单地使用

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多