[QT]Signal/Slot Problem über mehrere Klassen
-
Hallo wulfgar,
Das war auch meine erste Überlegung gewesen allerdings kommt dann beim kompilieren folgender Fehler
no matching function for call to `NewKeyDialog::connect(KeyCreate*&, const char[25], NewKeyDialog* const, const char[36])'
-
The_EcKo schrieb:
Hallo wulfgar,
Das war auch meine erste Überlegung gewesen allerdings kommt dann beim kompilieren folgender Fehler
no matching function for call to `NewKeyDialog::connect(KeyCreate*&, const char[25], NewKeyDialog* const, const char[36])'
Ok, jetzt ist mir was bei der Fehlermeldung aufgefallen. Und zwar das "KeyCreate*&" sieht so aus als würde er dein keycreate als eine Referenz auf einen Pointer ansehen. Warum auch immer. Hast du vielleicht im Header irgendwas am Typ von keycreate geändert oder ist das immernoch KeyCreate*?
-
Nein habe nichts geändert
ist immernochKeyCreate *keycreate;
in newkeydialog.hh
-
Wie initialisierst du keycreate?
Ne, vergiss es, das ist Unsinn. Von Initialisierungen zur Laufzeit hat der Kompiler eh keine Ahnung. Ich fürchte im Moment kann ich dir nicht helfen. Hab grad keinen Rechner mit QT in der Nähe auf dem ich das mal testen könnte. Vielleicht kann dir ja ein anderer helfen, bis ich dazu komm.
-
Ok, eine Idee hab ich noch: Du deklarierst KeyCreate in der Header von NewKeyDialog vor, aber includierst du dann den Header von Keycreate in der Code-Datei von NewKeyDialog?
Das ist was das ich sehr gerne vergesse und das gibt dann die merkwürdigsten Kompiler-Fehler.
-
Glaube der Fehler könnte daran liegen, dass ich
in newkeydialog.hh lediglich eine Forwarddeklaration gemacht habe mitclass KeyCreate;
deswegen kann er auch die Funktion nicht finden die er aufrufen soll.
Das nächste Problem dabei ist allerdings, newkeydialog.hh ist bereits in keycreate.hh includiert weil keycreate ein Signal von newkeydialog bekommt(Key erstellen)
Wenn ich jetzt aber keycreate.hh in newkeydialog.hh includiere kommt mir
ISO C++ forbids declaration of `KeyCreate' with no type newkeydialog.hh
in
newkeydialog.hh Keycreate *keycreate;
Haben wir wohl gerade denselben gedanken gehabt ^^
-
The_EcKo schrieb:
Glaube der Fehler könnte daran liegen, dass ich
in newkeydialog.hh lediglich eine Forwarddeklaration gemacht habe mitclass KeyCreate;
deswegen kann er auch die Funktion nicht finden die er aufrufen soll.
Das nächste Problem dabei ist allerdings, newkeydialog.hh ist bereits in keycreate.hh includiert weil keycreate ein Signal von newkeydialog bekommt(Key erstellen)
Wenn ich jetzt aber keycreate.hh in newkeydialog.hh includiere kommt mir
ISO C++ forbids declaration of `KeyCreate' with no type newkeydialog.hh
in
newkeydialog.hh Keycreate *keycreate;
Haben wir wohl gerade denselben gedanken gehabt ^^
Ja, das kommt daher, dass es C++ nicht mag, wenn sich Header gegenseitig verlinken. Dann musst du in der Header die Vorwärst-Deklaration machen und das include in der cpp machen, dann geht es.
Aber bist du sicher, dass du NewKeyDialog in KeyCreate includieren musst? Das Signal/Slot-Konstrukt kommt von QT kommt doch normalerweise ohne sowas aus.
-
Super wulfgar jetzt geht es sehr geil danke
Ja muss newkeydialog in keycreate bekommen weil das Signal accepted von newkeydialog wenn man auf "OK" drückt um einen Key zu erstellen an keycreate geht welches darauf hin die Funktion aufruft diesen Key tatsächlich zu erstellen.
-
Bitte schön. Freut mich doch, wenn ich helfen kann.
-
Servus ich bins nochmal
Also kompilieren klappt jetzt wunderbar nur beim ausführen kommt es jetzt zu Problemen:
Und zwar stoppt das Programm jedesmal wenn es zumconnect(keycreate, SIGNAL(maxKeys(QString)), this, SLOT(deleteFromNameList(QString)));
in newkeydialog.cc kommt
Der Debugger gibt mir folgende Meldung:
Program received SIGSEGV, Segmentation fault. 0x6a25bc00 in QObject::connect(QObject const*, char const*, QObject const*, char const*, QT::ConnectionType) (sender=0xbaadf00d, signal=0x5a5257 "2maxKeys(QString)", receiver=0x72574e8, method=0x5a523a "1deleteFromNameList(QString)", type=AutoConnection) at kernel/qobject.cpp:2463 2463 kernel/qobject.cpp : No such file or directory in kernel/qobject.cpp
Denke es liegt daran, dass dieser connect Aufruf im Konstruktor erfolgt und auch noch irgendwie mit der Forwarddeklaration zusammenhängt. Kann das Puzzle aber nicht ganz zusammensetzen
edit: DIe betreffende Zeile in qobject.cpp sieht so aus
QMutexLocker locker(signalSlotLock(this));