Несколько файлов и выбор папок в QFileDialog? - PullRequest
12 голосов
/ 26 июня 2011

Я использую pyQt4 и хочу, чтобы в моем графическом интерфейсе была кнопка «Обзор», которая открывает диалоговое окно, позволяющее пользователю выбрать несколько папок И . Я немного исследовал, но я не нашел способа сделать это.

QFileDialog.getOpenFileNames () позволяет мне выбирать только файлы, а QFileDialog.getExistingDirectory () позволяет выбирать только каталоги.

Можно ли как-нибудь совместить их функциональность. В идеале я хотел бы использовать nativeDialogs, но это не представляется возможным. В результате я готов пойти на компромисс по внешности. Можно ли как-то реализовать сказанное?

Здесь также задавался тот же вопрос, но ответ был на с ++. Мне нужна реализация Python. Разрешить пользователю выбирать файл или папку в QFileDialog

Ответы [ 2 ]

9 голосов
/ 05 июля 2011

Вот хак, который должен работать для вас: Создайте подкласс 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
0 голосов
/ 02 января 2018

В Qt5 вы можете просто использовать

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