2012-08-31 9 views
6

piszę prostego kodu przy użyciu PyQtżadne pliki widoczne w oknie QFileDialog

W kodzie, I wywołać QFileDialog, jednak kiedy ją wywołać za pomocą statycznych funkcji wszystko działa poprawnie, ale z normalną metodą IE używając dialog.exec_(), Nie widzę żadnych plików w oknie dialogowym pliku.

Dopiero po wpisaniu pełnej ścieżki pliku mogę zobaczyć plik w oknie dialogowym pliku. Zauważ, że ten problem występuje tylko wtedy, gdy wywołuję funkcję FileDialoghandler. Jeśli tego nie zrobię, niezależnie od tego, jak wywołuję funkcję QFileDialog, wszystko działa poprawnie. A także ten problem dotyczy tylko systemu Linux, na Windows7 wszystko działa poprawnie. Zastanawiam się, czy jest to błąd PyQt, czy też coś tu brakuje?

Kod jest następujący:

import sys 
from PyQt4.QtCore import Qt 
from PyQt4.QtGui import * 
from PyQt4.QtCore import QAbstractFileEngine 
from PyQt4.QtCore import QAbstractFileEngineHandler 
from PyQt4.QtCore import QFSFileEngine 

class FileDialogHandler(QAbstractFileEngineHandler): 
    def create(self,filename): 
     if str(filename).startswith(':'): 
      return None # Will be handled by Qt as a resource file 
     print("Create QFSFileEngine for {0}".format(filename)) 
     return QFSFileEngine(filename) 

class Example(QMainWindow): 

    def __init__(self): 
     super(Example, self).__init__() 

     self.initUI() 

    def initUI(self):  

     self.textEdit = QTextEdit() 
     self.setCentralWidget(self.textEdit) 
     self.statusBar() 

     openFile = QAction(QIcon('open.png'), 'Open', self) 
     openFile.setShortcut('Ctrl+O') 
     openFile.setStatusTip('Open new File') 
     openFile.triggered.connect(self.showDialog) 

     menubar = self.menuBar() 
     fileMenu = menubar.addMenu('&File') 
     fileMenu.addAction(openFile)  

     self.setGeometry(300, 300, 350, 300) 
     self.setWindowTitle('File dialog') 
     self.show() 

    def showDialog(self): 
     handler = FileDialogHandler() 
     #using QFileDialog.getOpenFileName works fine 
     fname = QFileDialog.getOpenFileName(None, 'Open file', '/home','All files (*.*)') 
     #dialog = QFileDialog() 
     #dialog.setOption(QFileDialog.DontUseNativeDialog,False) 
     #if dialog.exec_(): 
      #fname = dialog.selectedFiles() 
     #else: 
      #fname = None 
     f = open(fname, 'r')   
     with f:   
      data = f.read() 
      self.textEdit.setText(data) 

def main(): 
    app = QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

Potwierdzono, że nie działa dla mnie w systemie Linux. Jednak ten sam kod działa z PySide - więc prawdopodobnie jest to błąd PyQt. Proponuję, abyś zgłosił to na [liście dyskusyjnej PyQt] (http://www.riverbankcomputing.com/mailman/listinfo/pyqt), aby uzyskać ostateczną odpowiedź. – ekhumoro

+0

Wydaje się działać na OS X. Dlaczego naprawdę potrzebujesz 'QFSFileEngine'? –

+0

Uważaj z 'f = open (fname, 'r'); z f'. Nie tylko możesz umieścić dwie instrukcje w jednym 'z otwartym (fname, 'r') jako f', ale powinieneś przede wszystkim enkapsulować go w' try ... except 'z wyjątkiem IOError', aby nie upaść jeśli użytkownik naciśnie "Anuluj" (tj., gdy 'fname =" "') –

Odpowiedz

6

I napotkał podobny problem nie dawno z GetOpenFileName. Dla mnie rozwiązaniem była zmiana backendu z natywnego na własną implementację okna dialogowego Qt. Można to osiągnąć dzięki rozszerzonej składni wywołań, która wygląda następująco:

filename = QtGui.QFileDialog.getOpenFileName(self, 
              'Open file', 
              '/home', 
              'All files (*.*)', 
              options=QtGui.QFileDialog.DontUseNativeDialog) 

Po zmianie na składnię wywołania nigdy więcej nie miałem problemów.

Powiązane problemy