[Gelöst] Eigenes Widget -> TypeError ("kein QWidget&

Alles rund um die Programmierung mit Qt
Antworten
EdgarButan
Beiträge: 8
Registriert: 25. März 2010 14:10

[Gelöst] Eigenes Widget -> TypeError ("kein QWidget&

Beitrag von EdgarButan »

Hallo,

ich bin mir im Moment nicht sicher, ob ich mit diesem Problem in einem Qt- oder einem Python-Forum nachfragen muss, ich tippe aber auf das Qt-Forum.

Ich habe im Qt-Designer ein eigenes Widget zusammengebaut und mit pyuic daraus eine Klasse bauen lassen, die in einer separaten .py-Datei liegt (das ist Standardprozedere bei Python).
In Python ist es nun so, dass ich eine eigene Klasse (nennen wir sie "GeerbteWidgetKlasse") erstellen muss, die von dieser gerade gebauten Klasse erbt und bei der Initialisierung darin eine Funktion (setupUi()) aufruft, um das Widget zu initialisieren.

Dieses Widget möchte ich nun in einer QGraphicsView mit einem QGraphicsProxyWidget einbinden.
Wenn ich nun dem Konstruktor von QGraphicsProxyWidget eine Instanz meiner GeerbteWidgetKlasse übergebe, meldet der Python-Interpreter mir (logischerweise):

Code: Alles auswählen

TypeError: QGraphicsProxyWidget(QGraphicsItem parent=None, Qt.WindowFlags flags=0): argument 1 has unexpected type 'GeerbteWidgetKlasse'
Ich habe kein Problem damit, mit den richtigen Begriffen mir im Internet selbst eine Lösung zu suchen, ich weiß nur hier leider nicht, wo ich mit welchen Begriffen ansetzen muss. Meine bisherige Suche hat zu nichts geführt (ich habe sogar schon versucht, den Typ meiner GeerbteWidgetKlasse mit Python-Mitteln zu manipulieren und "QWidget" zu nennen, aber das hat nicht funktioniert und wäre selbstverständlich unglaublich hässlich gewesen, insofern bin ich froh darum ;))

Für ein paar Hinweise wäre ich sehr dankbar.

Gruß
EdgarButan
Zuletzt geändert von EdgarButan am 27. März 2010 08:49, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Eigenes Widget -> TypeError ("kein QWidget"

Beitrag von franzf »

EdgarButan hat geschrieben:Ich habe im Qt-Designer ein eigenes Widget zusammengebaut und mit pyuic daraus eine Klasse bauen lassen, die in einer separaten .py-Datei liegt (das ist Standardprozedere bei Python).
So ist es auch in C++. Die Python-Fraktion steht da eigentlich mehr auf ui laden zur Laufzeit. Da gibt es ein eigenes uic-Modul für Python. Schaus dir mal an :)
In Python ist es nun so, dass ich eine eigene Klasse (nennen wir sie "GeerbteWidgetKlasse") erstellen muss, die von dieser gerade gebauten Klasse erbt und bei der Initialisierung darin eine Funktion (setupUi()) aufruft, um das Widget zu initialisieren.
Aber du erbst dann schon auch von QWidget, oder?
Kannst du mal etwas Code zeigen?
Speziell Klassendefinition.

Ciao
EdgarButan
Beiträge: 8
Registriert: 25. März 2010 14:10

Beitrag von EdgarButan »

Ui laden zur Laufzeit? Da wird dann zur Laufzeit die Ui-Datei erst kompiliert, oder wie?
Warum das denn?

Ja, ich erbe von QWidget und meiner eigenen Klasse, die pyuic kompiliert hat.
Das sieht dann folgendermaßen aus:

Code: Alles auswählen

class Eingabemaske(QWidget, Ui_eingabewidget):
  def __init__(self):
    QWidget.__init__(self)
    self.setupUi(self)
Die wohl nicht ganz so interessante, von pyuic kompilierte Klasse:

Code: Alles auswählen

class Ui_eingabewidget(object):
    def setupUi(self, eingabewidget):
        eingabewidget.setObjectName("eingabewidget")
        eingabewidget.setWindowModality(QtCore.Qt.NonModal)
        eingabewidget.setEnabled(True)
...
usw.
[quote][/quote]
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

EdgarButan hat geschrieben:Ui laden zur Laufzeit? Da wird dann zur Laufzeit die Ui-Datei erst kompiliert, oder wie?
Warum das denn?
*) Python kennt kein Kompilieren. Das sind rein interpretierte Scripte.
*) pyuic für Python2 und Python3 erzeugt unterschiedlichen inkomplatiblen Code.
Es gab noch mehr Punkte, an die ich mich dank mangelnder Aktivität in Sachen Python nicht mehr erinner :P

Der gepostete Code ist in Ordnung. Trotzdem meinerseits ein dickes OUCH dass ich den Fehler nicht gleich erkannt hab...

Code: Alles auswählen

TypeError: QGraphicsProxyWidget(QGraphicsItem parent=None, Qt.WindowFlags flags=0): argument 1 has unexpected type 'GeerbteWidgetKlasse'
Sagt mir dass du das ganze ungefähr so verwendest:

Code: Alles auswählen

widget = GeerbeteWidgetKlasse()
proxy = QGraphicsProxyWidget( widget )
Und wenn du dir die Signatur anschaust:

Code: Alles auswählen

QGraphicsProxyWidget(QGraphicsItem parent=None, Qt.WindowFlags flags=0)
QGraphicsProxyWidget-Konstruktor erwartet als 1. Parameter ein QGraphicsItem als parent - und nicht das zu verwaltende Widget. Das setzt du mit "QGraphicsProxyWidget.setWidget()".
EdgarButan
Beiträge: 8
Registriert: 25. März 2010 14:10

Beitrag von EdgarButan »

franzf hat geschrieben:
EdgarButan hat geschrieben:Ui laden zur Laufzeit? Da wird dann zur Laufzeit die Ui-Datei erst kompiliert, oder wie?
Warum das denn?
*) Python kennt kein Kompilieren. Das sind rein interpretierte Scripte.
*) pyuic für Python2 und Python3 erzeugt unterschiedlichen inkomplatiblen Code.
Es gab noch mehr Punkte, an die ich mich dank mangelnder Aktivität in Sachen Python nicht mehr erinner :P
Ja, Punkt 1 weiß ich schon. Als ich das Wort „kompilieren“ geschrieben hab, dachte ich mir schon, dass es dafür wahrscheinlich Ärger gibt ;)
Der gepostete Code ist in Ordnung. Trotzdem meinerseits ein dickes OUCH dass ich den Fehler nicht gleich erkannt hab...

Code: Alles auswählen

TypeError: QGraphicsProxyWidget(QGraphicsItem parent=None, Qt.WindowFlags flags=0): argument 1 has unexpected type 'GeerbteWidgetKlasse'
Sagt mir dass du das ganze ungefähr so verwendest:

Code: Alles auswählen

widget = GeerbeteWidgetKlasse()
proxy = QGraphicsProxyWidget( widget )
Und wenn du dir die Signatur anschaust:

Code: Alles auswählen

QGraphicsProxyWidget(QGraphicsItem parent=None, Qt.WindowFlags flags=0)
QGraphicsProxyWidget-Konstruktor erwartet als 1. Parameter ein QGraphicsItem als parent - und nicht das zu verwaltende Widget. Das setzt du mit "QGraphicsProxyWidget.setWidget()".
Alles korrekt, jetzt funktioniert es. Hätte ich auch selber sehen können…
Vielen Dank![/quote]
Antworten