metaclass conflict mit PyQt4

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Deever
User
Beiträge: 15
Registriert: Samstag 30. Juli 2005, 12:46

Hey Amigos, wie geht's?

Ich habe ein Metaklassenproblem im Zusammenhang mit PyQt4. Und zwar habe ich ein MainWindow, das verschiedene Widgets als Unterfenster erhalten soll. Deren Klassenobjekte sollen bei ihrer Erzeugung und Erzeugung von Instanzen nicht-klassenspezifischen Code ausführen, z.b. den Namen der Klasse, die erzeugt wird, soll irgendwo hingespeichert werden. Ich wollte deshalb dafür Metaklassen einsetzen, weil der Code nicht statisch implementiert werden kann, da dynamisch neue Klassen hinzugefügt werden können. Ich habe für die Unterfenster eine eigene Parentklasse kreiert:

Code: Alles auswählen

class SubWindow(QWidget):
    class __metaclass__(type):
        # [...]
Leider klappt das nicht, denn die Erzeugung von SubWindow wirft folgende Exception:

Code: Alles auswählen

TypeError: Error when calling the metaclass bases
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
Das gleiche passiert, wenn ich die Metaklasse in eine separate Basisklasse packe und dann SubWindow von dieser (und QWidget) ableite. Wie kann ich das Problem beheben?

Vielen Dank für eure Antworten!
Gruß,
/dev
Deever
User
Beiträge: 15
Registriert: Samstag 30. Juli 2005, 12:46

Nun?
Niemand eine Idee, wie man das Problem lösen könnte?

Vielen Dank && Gruß,
/dev
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,
Deever hat geschrieben:

Code: Alles auswählen

TypeError: Error when calling the metaclass bases
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
Die Metaklasse von SubWindow muss von der der Superklasse abgeleitet sein. Versuch mal:

Code: Alles auswählen

class SubWindow(QWidget):
    class __metaclass__(QWidget.__metaclass__):
        # [...]
Gruß,
Manuel
Antworten