PyQt: pourquoi l'ajout d'une définition de classe fictive dans mon fichier provoque le blocage de l'application?
Question
Considérez le code ci-dessous:
#!/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_())
Fonctionne bien. Maintenant, si j’ajoute une classe fictive (qui hérite de la classe d’un module QtGui) dans la portée globale ...
class MainWindow(QtGui.QMainWindow):
... # unchanged
class MyWidget(QtGui.QWidget):
def __init__(self):
super(MyWidget, self).__init__()
if __name__ == '__main__':
... # unchanged
... quand je lance le script j'obtiens l'erreur:
TypeError: argument 1 de QMainWindow.setCentralWidget () a un type invalide
Ce message d'erreur est cryptique pour moi car je ne peux pas le connecter à la modification effectuée. Avez-vous une idée de ce qui pourrait être la source de cette erreur?
La solution
Impossible de reproduire le problème tel qu'il a été signalé: le code exact suivant
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_())
fonctionne très bien pour moi (montrant une fenêtre vide bien sûr). Donc, je suppose que cela dépend des détails des versions! J'utilise Python 2.5.1 fourni par le système sur Mac OS X 10.5.7 et j'ajoute un
print QtCore.PYQT_VERSION_STR
montre que je suis sur la version 4.5.1 de PyQt. Et vous?
Autres conseils
Je n'ai jamais travaillé avec PyQt auparavant, mais n'avez-vous pas oublié d'appeler le constructeur de la superclasse ici?
class MyWidget(QtGui.QWidget):
def __init__(self):
# Where is the call to QtGui.QWidget's init ?
pass