2014-11-18 3 views
0

Этот вопрос уже существует here, но ответ кажется устаревшим или больше не работает с Python 2.7.Несколько файлов и выбор папок в QFileDialog (Revisited)

Когда я использую этот код для подкласса моего QFileDialog, вызывается класс initDialog, но метод openClicked никогда не вызывается.

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 

Правильный ли звонок для FileDialog?

mydialog = FileDialog() 
filelist = mydialog.getExistingDirectory(self, "Select Stuff", "", QtGui.QFileDialog.DontConfirmOverwrite) 

ответ

2

Решение другого вопроса излишне сложно. Все, что вам нужно сделать, это переопределить QFileDialog.accept(), а затем вы можете реализовать любое поведение, которое вам нравится.

Приведенный ниже пример очень минимален. Он не выполняет никакой проверки выбранных файлов (например, видение, существуют ли они все еще), но это может быть легко добавлено в случае необходимости.

from PyQt4 import QtCore, QtGui 

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

    def accept(self): 
     super(FileDialog, self).accept() 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.button = QtGui.QPushButton('Test', self) 
     self.button.clicked.connect(self.handleButton) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.button) 

    def handleButton(self): 
     dialog = FileDialog() 
     if dialog.exec_() == QtGui.QDialog.Accepted: 
      print(dialog.selectedFiles()) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
+0

Genius. Спасибо, мы все на разных уровнях нашего понимания этого замечательного языка программирования .. некоторые более или менее, чем другие. :) – panofish

+0

Я получаю: RuntimeError: суперкласс __init __() типа Window никогда не назывался –

+0

@cyclops. Спасибо - теперь нужно исправлять. – ekhumoro

Смежные вопросы