2016-07-27 2 views
1

Я создаю свой собственный диалог пользовательского файла, используя следующий код:QFileDialog просматривать папки и файлы, но только выбирать папки?

file_dialog = QtGui.QFileDialog() 
file_dialog.setFileMode(QtGui.QFileDialog.Directory) 
file_dialog.setViewMode(QtGui.QFileDialog.Detail) 
file_dialog.setOption(QtGui.QFileDialog.DontUseNativeDialog, True) 

поведение, которое я заинтересован в это для пользователя, чтобы иметь возможность просматривать как файлы и папки, но выбрать папки только. (делая файлы недоступными). Это возможно?

Примечание: Использование опции DirectoryOnly не хорошо для меня, так как он не позволяет просматривать файлы, только папки.

Редактировать (дополнительный код, который я забыл добавить, который отвечает за возможность выбрать несколько папок, а не только один):

file_view = file_dialog.findChild(QtGui.QListView, 'listView') 
if file_view: 
    file_view.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) 
f_tree_view = file_dialog.findChild(QtGui.QTreeView) 
if f_tree_view: 
    f_tree_view.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) 
+0

Код, который вы опубликовали, делает именно то, что вы говорите, что вы хотите (то есть пользователь может просматривать файлы и директории, но выбирать только dirs). Поэтому, возможно, вам нужно более четко объяснить, чего вы хотите достичь. – ekhumoro

+0

Не совсем .. приведенный выше код позволяет вам выбирать файлы. – YaronGh

+0

Для меня кнопка «Выбрать» активируется только при выборе каталогов. Можно * выбрать * файлы, но не выбирать их (потому что кнопка отключена). – ekhumoro

ответ

2

Чтобы предотвратить файлы выбраны, вы можете установить модель прокси, который манипулирует флагами для элементов в файловом представлении:

class ProxyModel(QtGui.QIdentityProxyModel): 
    def flags(self, index): 
     flags = super(ProxyModel, self).flags(index) 
     if not self.sourceModel().isDir(index): 
      flags &= ~QtCore.Qt.ItemIsSelectable 
     return flags 


# keep a reference somewhere to prevent core-dumps on exit 
self._proxy = ProxyModel(self) 

file_dialog.setProxyModel(self._proxy) 
+0

Okay great thanks! Я не уверен, должен ли я открыть новый вопрос для этого или нет (дайте мне знать) - но есть ли быстрая модификация, которую я мог бы сделать в моем коде выше, чтобы иметь возможность выбирать обе папки и файлы? – YaronGh

+1

@YaronGh. 'File_dialog.setProxyModel (отсутствует)'. – ekhumoro

+0

Если я это сделаю, он вернет выбранный файл + все остальные файлы в этой папке – YaronGh