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()
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
Parece que funciona en OS X. ¿Por qué realmente necesita un 'QFSFileEngine'? –
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 =" "') –