PyQt: ¿por qué agregar una definición de clase ficticia en mi archivo hace que la aplicación se bloquee?
Pregunta
Considere el siguiente código:
#!/usr/bin/env python
from PyQt4 import QtCore, QtGui
import os,sys
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.listWidget = QtGui.QListWidget(None)
self.setCentralWidget(self.listWidget)
if __name__ == '__main__':
app = QtGui.QApplication (sys.argv)
mainWin = MainWindow ()
mainWin.show ()
sys.exit (app.exec_())
Funciona bien. Ahora, si agrego una clase ficticia (que hereda de la clase de un módulo QtGui) en el ámbito global ...
class MainWindow(QtGui.QMainWindow):
... # unchanged
class MyWidget(QtGui.QWidget):
def __init__(self):
super(MyWidget, self).__init__()
if __name__ == '__main__':
... # unchanged
... cuando inicio el script, aparece el error:
TypeError: argumento 1 de QMainWindow.setCentralWidget () tiene un tipo no válido
Este mensaje de error es críptico para mí, ya que no puedo conectarlo a la modificación realizada. ¿Tienes idea de cuál podría ser la fuente de este error?
Solución
No se puede reproducir el problema como se informó: el siguiente código exacto
from PyQt4 import QtCore, QtGui
import os, sys
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.listWidget = QtGui.QListWidget(None)
self.setCentralWidget(self.listWidget)
class MyWidget(QtGui.QWidget):
def __init__(self):
super(MyWidget, self).__init__()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())
funciona bien para mí (mostrando una ventana vacía, por supuesto). ¡Así que supongo que se trata de detalles de versiones! Estoy usando Python 2.5.1 suministrado por el sistema en Mac OS X 10.5.7 y agrego un
print QtCore.PYQT_VERSION_STR
muestra que estoy en la versión 4.5.1 de PyQt. ¿Qué hay de ti?
Otros consejos
No he trabajado con PyQt antes, pero ¿no olvidaste llamar al constructor de la superclase aquí?
class MyWidget(QtGui.QWidget):
def __init__(self):
# Where is the call to QtGui.QWidget's init ?
pass