PyQt QFileDialog - 多目录选择

dan*_*n_g 3 python qt pyqt qtreeview qfiledialog

我正在尝试创建一个允许用户选择多个目录的 QFileDialog。

遵循此处的讨论和此处常见问题解答,但我不确定我做错了什么。我得到一个文件对话框,但它仍然只允许我选择一个目录(文件夹)。

这是在 Windows 7 上

代码:

class FileDialog(QtGui.QFileDialog):
        def __init__(self, *args):
            QtGui.QFileDialog.__init__(self, *args)
            self.setOption(self.DontUseNativeDialog, True)
            self.setFileMode(self.DirectoryOnly)

            self.tree = self.findChild(QtGui.QTreeView)
            self.tree.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)

            self.list = self.findChild(QtGui.QListView)
            self.list.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    ex = FileDialog()
    ex.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

编辑:

所以在玩了更多之后,如果我在文件对话框中选择“详细信息视图”,多选就可以了。但是,如果我选择“列表视图”,则它不起作用。知道为什么吗?

ekh*_*oro 5

FAQ 中的示例代码并不健壮,因为它假设对话框只有 1QListView和 1 QTreeViewfindChild当有几个直接的子对象时,的行为是不确定的:所以它曾经工作过可能只是纯粹的运气。

更强大的解决方案是在其模型类型为 a 的任何视图上重置选择模式QFileSystemModel

for view in self.findChildren((QListView, QTreeView)):
    if isinstance(view.model(), QFileSystemModel):
        view.setSelectionMode(QAbstractItemView.ExtendedSelection)
Run Code Online (Sandbox Code Playgroud)

  • @DirkHaupt。`view.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)`。 (2认同)