[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 immernoch

    KeyCreate *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 mit

    class 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 mit

    class 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 zum

    connect(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));
    

Anmelden zum Antworten