[gelöst] Eigene Public Slots funktionieren nicht!

Alles rund um die Programmierung mit Qt
TheDON
Beiträge: 21
Registriert: 18. April 2006 22:25

[gelöst] Eigene Public Slots funktionieren nicht!

Beitrag von TheDON »

Hallo Zusammen!

Habe mich ein bisschen rumgesehen und konnte feststellen, dass hier alles Qt Profis vorhanden sind! Cool! :D
Dann kann mir sicherlich jemand bei diesem Problem weiterhelfen.

Und zwar funktionieren meine eigene Public Slots nicht!

Ein paar Beispiele:

Wenn ich folgendes mache:

Code: Alles auswählen

QObject::connect(btn_EintragEntfernen, SIGNAL(clicked()), btn_Suchen, SLOT(hide()));
dann geht das wunderbar! ...ich verwende hier nämlich als Slot "hide()".

Wenn ich jetzt aber folgendes mache:

Code: Alles auswählen

QObject::connect(btn_EintragHinzufuegen, SIGNAL(clicked()), this, SLOT(onEintragHinzufuegenClicked()));
Dann passiert schlicht und einfach NICHTS!! :(

Was mache ich denn falsch??

Ich habe schon mehrere Male Eigene Slots erstellt und diese funzten auch.

Nun habe ich mir aber die Qt 4.1.1 Version installiert und diese mit vc2005 verbastellt und nun geht es nicht mehr...

(vorher hatte ich mingw als compiler... besteht vielleicht ein Problem mit MS vc2005??)
Erstellt habe ich das GUI mit dem Designer... aber sollte keine Rolle spielen...


Kann mir jemand weiterhelfen??

Jungs, besten Dank für eure Hilfe!!

Gruss,
TheDON
Zuletzt geändert von TheDON am 4. Mai 2006 11:53, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Nichts, gibt es nicht. Wenn es nicht funktioniert gibt es sicher irgendwo eine Fehlermeldung (Im Zweifelsfalle auf der Konsole...)
TheDON
Beiträge: 21
Registriert: 18. April 2006 22:25

Beitrag von TheDON »

Hallo Upsala!
Besten Dank für deine Antwort!

Ja, du hast recht! Das Problem bei Signals und Slots ist aber, dass keine Fehlermeldung sowie keine Warnung ausgelöst wird!
Sogar wenn du einen nicht existenten Slot oder Signal verwendest.
Ich kann dir aber garantieren, dass keine Schreibfehler vorliegen...
Habe es mehrmals abgecheckt. :wink:
Syntaxmässig sieht auch alles gut aus, wie du erkennen kannst...


Das Problem liegt schlicht und einfach daran, dass der connect mit dem eigenen Slot nicht tut... keine Ahnung aber wieso... :(


Any other hints??

Danke!
TheDON
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

TheDON hat geschrieben:Das Problem bei Signals und Slots ist aber, dass keine Fehlermeldung sowie keine Warnung ausgelöst wird!
Klar gibt es eine Meldung, die sagt sogar aus, ob es das Signal oder den Slot nicht gibt. Die Meldung kommt aber nicht beim compilieren, sondern erst beim debuggen. Setze vor den connect einen Breakpoint und step dann drüber. Dann solltest Du eigentlich sehen woran es hapert. Meist ist eine falsche Deklaration daran schuld. Die steht dann unter private: oder public:, anstatt unter private slots: oder public slots:
TheDON
Beiträge: 21
Registriert: 18. April 2006 22:25

Beitrag von TheDON »

Hallo macman!

Vielen Dank für den Hinweis!
OK werde ich versuchen...
Gebe später nochmals bescheid!

Bis dann...

Gruss,
TheDON
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Das Projekt mit der Option debug (CONFIG += debug) übersetzen und du siehst auf der Konsole die besagten Warnungen.
Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag von Alci »

Hi,

onEintragHinzufuegenClicked():
Ist das dein definierter SLOT? Das was mir jetzt spontan einfällt ist, dass die definition deines SLOT's nicht richtig ist. Du könntest ja mal den Ausschnitt posten, wo der SLOT definiert wird.

MfG, Alci.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Er kann doch seine Slots nennen wie er möchte!?!
Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag von Alci »

Er kann doch seine Slots nennen wie er möchte!?!
Ach ne, wirklich? Habe ich das Gegenteil behauptet?
Ich will nur sehen, ob er sein Slot auch wirklich richtig definiert hat.
TheDON
Beiträge: 21
Registriert: 18. April 2006 22:25

Beitrag von TheDON »

Hallo Jungs!

Sorry wenn ich erst jetzt antworte...
aber hatte heute keine Zeit zu testen.. muss nun das mit dem Debugger anschauen... gebe danach bescheid.

Zu Alci:

Hier ist die definition im Header gui.h:

Code: Alles auswählen

public slots:
			 // QActions on Menubar
             void onDiktionaerOeffnenSelected();
             void onNeuesDiktionaerErstellenSelected();
             void onBestehendesDiktionaerLoeschenSelected();
             void onBeendenSelected();
             void onHilfethemenSelected();
             void onAboutSelected();

			 // QPushButtons
             void onEintragHinzufuegenClicked();
             void onEintragEntfernenClicked(); 
			 void onAenderungenSpeichernClicked();
			 void onGesamtesDiktionaerAnzeigenClicked();
			 void onSuchenClicked();
Wie gesagt... kriegs im Moment nicht hin... :-(

also bis dann jungs!! Und danke nochmals!! sehr nett von euch allen!! :)
TheDON
Beiträge: 21
Registriert: 18. April 2006 22:25

Beitrag von TheDON »

Hey Jungs!!! Ich habe die Ursache gefunden!!!

Besten Dank an Nassian für den Debug Tip ;-)

Also.. schaut Mal... das kommt beim Debugger heraus:

Code: Alles auswählen

Object::connect: No such slot QMainWindow::onEintragHinzufuegenClicked()
Object::connect:  (sender name:   'btn_EintragHinzufuegen')
Habt ihr gesehen??? Er will einen Slot connecten der Klasse QMainWindow!! Und nicht MEIN SLOT, also von der Klasse GUI!!
Wieso denn das??

Ich habe dann folgendes versucht:
SLOT(GUI::onEintragHinzufuegenClicked())

Auch das leider ohne Erfolg! :-(

Der Debugger sagte dann:

Code: Alles auswählen

Object::connect: No such slot QMainWindow::GUI::onEintragHinzufuegenClicked()
Object::connect:  (sender name:   'btn_EintragHinzufuegen')
Dies bedeutet er WILL ZWINGEND den Slot von der Klasse QMainWindow holen!!

Wieso denn?? Es kann doch nicht sein, dass nur weil ich meine Klasse GUI von QMainWindow erbe, dass er dann meine eigene public / private slots nicht mehr akzeptiert...

Ist sicher was dummes.... :-D

Hier noch einen Auszug aus meiner gui.h Datei:

Code: Alles auswählen

class GUI : public QMainWindow
{

public:

    void setupGUI();
    void retranslateGUI(QWidget *parent);

public slots:
			 // QActions on Menubar
             void onDiktionaerOeffnenSelected();
             void onNeuesDiktionaerErstellenSelected();
             void onBestehendesDiktionaerLoeschenSelected();
             void onBeendenSelected();
             void onHilfethemenSelected();
             void onAboutSelected();

			 // QPushButtons
             void onEintragHinzufuegenClicked();
             void onEintragEntfernenClicked(); 
			 void onAenderungenSpeichernClicked();
			 void onGesamtesDiktionaerAnzeigenClicked();
			 void onSuchenClicked();

Jungs.... über jeden Hinweis wäre ich Dankbar!!

Danke und bis später... ;-)

TheDON
dumpfbacke
Beiträge: 4
Registriert: 20. April 2006 00:39

Beitrag von dumpfbacke »

O.o
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

TheDON hat geschrieben:Hier noch einen Auszug aus meiner gui.h Datei:
Hast Du das Q_OBJECT Makro raus gekürzt oder steht es da wirklich nicht drin? Da gehört nämlich eins rein, sonst erkennt Qt deine Slots nicht.
Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag von Alci »

Jep, das Q_OBJECT Macro fehlt.
Habe es mir fast gedacht, daher wollte ich deinen Code mal sehen.

Bei dir müsste es dann wie folgt ausschauen, damit das ganze funktionieren soll:
class GUI : public QMainWindow
{
Q_OBJECT

public:

void setupGUI();
void retranslateGUI(QWidget *parent);

public slots:
// QActions on Menubar
void onDiktionaerOeffnenSelected();
void onNeuesDiktionaerErstellenSelected();
void onBestehendesDiktionaerLoeschenSelected();
void onBeendenSelected();
void onHilfethemenSelected();
void onAboutSelected();

// QPushButtons
void onEintragHinzufuegenClicked();
void onEintragEntfernenClicked();
void onAenderungenSpeichernClicked();
void onGesamtesDiktionaerAnzeigenClicked();
void onSuchenClicked();
TheDON
Beiträge: 21
Registriert: 18. April 2006 22:25

Beitrag von TheDON »

Hallo Jungs!

Besten Dank!

Ja, hatte ich bereits probiert aber wenn ich das Q_OBJECT Macro einfüge dann habe ich nur Linkerfehlermeldungen

Ich habe jedoch gelesen, dass man in Verwendung von Q_OBJECT die "moc" Datei erstellen muss... ich wusste wie das funktioniert mit mingw als compiler... aber kann mir in diesem Fall jemand helfen mit vc2005?? Das wäre cool danke!!
...einfach eine Kurze step-by-step guide!

Danke jungs!!! ;-)

Gruss,
TheDON
Antworten