Slot überschreiben

Verschiedenes zu Qt
Antworten
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Slot überschreiben

Beitrag 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?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

"virtual" vergessen?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Slots sind normale Klassen-Methoden und können daher ganz normal mit "virtual" überschrieben werden.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Beitrag 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 :)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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:
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Beitrag 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 ;)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

franzf hat geschrieben:
solarix hat geschrieben:"virtual" vergessen?
Sollte "virtual" bei SLOTs nicht egal sein?
Ja, so ist es.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten