PyQt: perché l'aggiunta di una definizione di classe fittizia nel mio file causa l'arresto anomalo dell'applicazione?
Domanda
Considera il codice seguente:
#!/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_())
Funziona bene. Ora, se aggiungo una classe fittizia (che eredita dalla classe di un modulo QtGui) nell'ambito globale ...
class MainWindow(QtGui.QMainWindow):
... # unchanged
class MyWidget(QtGui.QWidget):
def __init__(self):
super(MyWidget, self).__init__()
if __name__ == '__main__':
... # unchanged
... quando lancio lo script ottengo l'errore:
TypeError: argomento 1 di QMainWindow.setCentralWidget () ha un tipo non valido
Questo messaggio di errore è criptico per me in quanto non riesco a collegarlo alla modifica effettuata. Hai idea di quale potrebbe essere la fonte di questo errore?
Soluzione
Impossibile riprodurre il problema come riportato: il seguente codice esatto
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_())
funziona perfettamente per me (mostrando ovviamente una finestra vuota). Quindi immagino che dipenda dai dettagli delle versioni! Sto usando Python 2.5.1 fornito dal sistema su Mac OS X 10.5.7 e aggiungendo un
print QtCore.PYQT_VERSION_STR
mostra che sono sulla versione 4.5.1 di PyQt. E tu?
Altri suggerimenti
Non ho mai lavorato con PyQt prima, ma non hai dimenticato di chiamare qui il costruttore della superclasse?
class MyWidget(QtGui.QWidget):
def __init__(self):
# Where is the call to QtGui.QWidget's init ?
pass