Issue
I am trying to create a QFileDialog that allows the user to select multiple directories.
Following the discussion here and the faq here, but I'm not sure what I'm doing wrong. I get a file dialog, but it still only lets me select a single directory (folder).
This is on Windows 7
Code:
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_())
Edit:
So after playing around with this some more, if I select "Detail View" in the file dialog, multiselection works. However, if I select "List View" it does not work. Any idea why?
Solution
The example code from the FAQ is not robust, because it assumes the dialog only has one QListView
and one QTreeView
. The behaviour of findChild
is indeterminate when there are several direct child objects: so it was probably just pure luck that it ever worked.
A more robust solution would be to reset the selection mode on any view for which the type of its model is a QFileSystemModel
:
for view in self.findChildren((QListView, QTreeView)):
if isinstance(view.model(), QFileSystemModel):
view.setSelectionMode(QAbstractItemView.ExtendedSelection)
Here's a simple demo script:
from PyQt5 import QtWidgets
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.button = QtWidgets.QPushButton('Choose Directories')
self.button.clicked.connect(self.handleChooseDirectories)
self.listWidget = QtWidgets.QListWidget()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.listWidget)
layout.addWidget(self.button)
def handleChooseDirectories(self):
dialog = QtWidgets.QFileDialog(self)
dialog.setWindowTitle('Choose Directories')
dialog.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True)
dialog.setFileMode(QtWidgets.QFileDialog.DirectoryOnly)
for view in dialog.findChildren(
(QtWidgets.QListView, QtWidgets.QTreeView)):
if isinstance(view.model(), QtWidgets.QFileSystemModel):
view.setSelectionMode(
QtWidgets.QAbstractItemView.ExtendedSelection)
if dialog.exec_() == QtWidgets.QDialog.Accepted:
self.listWidget.clear()
self.listWidget.addItems(dialog.selectedFiles())
dialog.deleteLater()
if __name__ == '__main__':
app = QtWidgets.QApplication(['Test'])
window = Window()
window.show()
app.exec_()
Answered By - ekhumoro
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.