2012-08-31 6 views
6

Estoy escribiendo un código simple usando pyqtningún archivo visible en la ventana QFileDialog

En el código, invoco una QFileDialog, sin embargo, cuando invoco usando las funciones estáticas todo funciona bien, pero con el decir, el método normal de usando dialog.exec_(), No veo ningún archivo en la ventana de diálogo del archivo.

Solo después de escribir la ruta completa del archivo puedo ver el archivo en la ventana de diálogo del archivo. Tenga en cuenta que este problema es solo cuando invoco la función FileDialoghandler. Si no hago eso, no importa cómo invoque el QFileDialog, todo funciona bien. Y también este problema es solo en Linux, en Windows 7 todo funciona bien. Me pregunto si esto es un error PyQt o me falta algo aquí?

Código es el siguiente:

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

Confirmado que no funciona para mí en Linux. Sin embargo, el mismo código funciona con PySide, por lo que posiblemente sea un error de PyQt. Sin embargo, le sugiero que lo informe en la [lista de correo de PyQt] (http://www.riverbankcomputing.com/mailman/listinfo/pyqt) para obtener una respuesta definitiva. – ekhumoro

+0

Parece que funciona en OS X. ¿Por qué realmente necesita un 'QFSFileEngine'? –

+0

Tenga cuidado con su 'f = open (fname, 'r'); con f'. No solo podrías poner las dos instrucciones en un solo 'con open (fname, 'r') como f', sino que debes sobre todo encapsularlo en un' try ... excepto IOError' para que no se cuelgue si el usuario presiona 'Cancelar' (es decir, cuando 'fname =" "') –

Respuesta

6

me encontré con un problema similar hace poco tiempo con el GetOpenFileName. Para mí, la solución fue cambiar el backend de nativo a la implementación propia del diálogo de Qt. Esto se puede lograr withan sintaxis de la llamada extendida que se parece a:

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

después de cambiar a esta sintaxis de llamada nunca he tenido ningún problema de nuevo.

Cuestiones relacionadas