2014-11-18 2 views
0

이 질문은 이미 here이지만이 대답은 구식이되거나 더 이상 Python 2.7에서 작동하지 않습니다.QFileDialog (Revisited)에서 여러 개의 파일 및 폴더 선택

이 코드를 사용하여 QFileDialog의 하위 클래스를 만들면 FileDialog 클래스 init가 호출되지만 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

천재. 고마워, 우리 모두는이 훌륭한 프로그래밍 언어에 대한 우리의 이해 수준이 서로 다르다. :) – panofish

+0

나는 RuntimeError를 받는다 : Window 유형의 수퍼 클래스 __init __()가 결코 호출되지 않았다. –

+0

@cyclops. 감사합니다 - 지금 고쳐야합니다. – ekhumoro