Seite 1 von 1

Slot überschreiben

Verfasst: 24. April 2010 18:46
von nexus
Hallo,

ich hab folgendes Problem. Ich hab eine GUI Klasse, welche Dialogfelder zur Verfügung stellt und die Möglichkeit bietet die Daten zu speichern. Jetzt möchte ich diese Klasse Vererben und den Slot welcher die Daten speichert überschreiben. Jedoch hab ich das Problem, dass immer nur der Slot der Basis-Klasse ausgeführt wird. Meine Frage ist nun wie stell ich es an, dass der Slot der Abgeleiteten Klasse aufgerufen wird?

Verfasst: 24. April 2010 18:54
von solarix
"virtual" vergessen?

Verfasst: 24. April 2010 18:59
von franzf
solarix hat geschrieben:"virtual" vergessen?
Sollte "virtual" bei SLOTs nicht egal sein?
Ich tippe eher auf "Q_OBJECT" in der abgeleiteten Klasse vergessen.

Verfasst: 24. April 2010 19:03
von solarix
Slots sind normale Klassen-Methoden und können daher ganz normal mit "virtual" überschrieben werden.

Verfasst: 24. April 2010 19:09
von franzf
solarix hat geschrieben:Slots sind normale Klassen-Methoden und können daher ganz normal mit "virtual" überschrieben werden.
Ist schon klar. Aber ich denke, er will den SLOT über ein SIGNAL ansteuern und der connect arbeitet über das metaObject, dem ist ein virtual schnurzwurscht.

Habs jetzt auch extra noch getestet. Das Verhalten tritt ein, wenn das Q_OBJECT in der abgeleiteten Klasse fehlt.

Wenn er aber das abgeleitete Widget über einen Basisklassenzeiger verwaltet und den SLOT als normale Methode anspricht hast du natürlich recht - virtual deklarieren und gut is.

Verfasst: 24. April 2010 19:16
von nexus
Mit Q_OBJECT hat es nicht funktioniert, da kam es immer zu Fehlermeldungen ("undefined reference") und wenn ich zusätzlich noch von QWidget geerbt habe gab es Fehlermeldungen wegen Mehrdeutigkeit.

Mit der Deklaration als virtual gibt jedoch keine Probleme, danke :)

Verfasst: 24. April 2010 19:29
von franzf
OK, ohne Q_OBJECT mit virtual geht es auch mit dem connect. Wieder was gelernt :)
Aber eigentlich sollte das Q_OBJECT-Macro schon drinnen stehen. Irgendwann wird es Probleme geben. Q_OBJECT deklariert wirtuelle Funktionen, der moc implementiert sie dann automatisch.
Die undefined reference kommt jetzt daher dass dein .h mit der Definition der abgeleiteten Klasse (und vllt. auch schon der deiner Basisklasse) nicht im .pro unter HEADERS steht, denn das macht der qmake im Makefile dann zu moc-Aufrufen.
Trag die Header die als Basisklasse QObject haben unter HEADERS in dein .pro ein und lass nochmal qmake laufen, bau nochmal mit make (oder welches Tool du da einsetzt), und es sollte laufen.

Verfasst: 24. April 2010 19:37
von solarix
Q_OBJECT braucht es nur, wenn eine Klasse Signals oder Slots besitzt. Wenn eine Klasse einfach nur eine virtuelle Methode (welche zufälligerweise halt ein slot ist) einer Basisklasse überschreibt brauchts das nicht.. weder früher noch später :wink:

Verfasst: 24. April 2010 19:59
von nexus
Danke,

hab wieder einiges gelernt :)

@ franzf

Ja, jetzt gibts auch mit dem Q_OBJECT Macro keine Probelme mehr, aber wie solarix sagte wird das in meinem Fall nicht benötigt ;)

Verfasst: 24. April 2010 22:53
von Christian81
franzf hat geschrieben:
solarix hat geschrieben:"virtual" vergessen?
Sollte "virtual" bei SLOTs nicht egal sein?
Ja, so ist es.