[Gtk+/gtkmm] Signal verbinden(Sig::)



  • Hallo,
    auch nach längerem Suchen kam ich nicht auf die Lösung folgenden Problems:

    class B(){
      void funktion(){};
     };
    
    class A(){
     A(){
     m_button.signal_clicked.connect(???)
     };
     Gtk:Button m_button;
     B b;
    };
    

    wie verbinde ich m_button.signal_clicked.connect mit b.funktion()?
    MfG Lukas



  • Hi,

    es gibt zwei Wege das zu bewerkstelligen (jedenfalls fallen mir spontan zwei ein):

    Du machst "funktion" static und dann mit ptr_fun draufgehen

    class B {
    public:
        static void funktion() {};
    };
    
    class A {
        Gtk:Button m_button;
        B b;
    
    public:
       A(){
         m_button.signal_clicked.connect(sigc::ptr_fun(&B::funktion))
       }
    
       Gtk:Button m_button;
       B b;
    };
    

    Oder eben so...

    class B {
    public:
        void funktion() {};
    };
    
    class A {
        Gtk:Button m_button;
        B b;
    
    public:
       A(){
         m_button.signal_clicked.connect(sigc::mem_fun(b, &B::funktion));
       }
    };
    

    Btw... hinter eine Klassendeklaration kommen keine normalen Klammern... und nächstes mal in die Doku schauen 😉

    Cheers

    GPC



  • Hallo,
    danke für deine schnelle Antwort.
    In deinen ersten Codeblock definierst du b und m_button zweimal, warum verstehe ich nicht. Sehe es mal als Fehler an.
    Auch wen man diesen Fehler bereinigt, funktionieren beide Ansätze nicht. Die Fehlermeldung lautet: |12|error: insufficient contextual information to determine type|
    neuer Code:

    #include <gtkmm.h>
    #include <iostream>
    class B{
    public:
        void funktion(){std::cout << "Geht" << std::endl;};
    };
    class Fenster : public Gtk::Window{
    public:
        Gtk::Button m_button;
        B b;
        Fenster():m_button("Geht"){
            m_button.signal_clicked.connect(sigc::mem_fun(b,&B::funktion));
            add(m_button);
            show_all_children();
        };
    };
    int main(int argc, char *argv[])
    {
        Gtk::Main main_obj(argc, argv);
        Fenster window_obj;
        main_obj.run(window_obj);
        return 0;
    };
    

    MfG
    Lukas
    P.s.: Hab gtkmm.org doc. durchgelesen und mich länger mit sig::mem_fun und sig::ptr_fun gespielt, gegoogelt und auch das Forum durchforstet, sonst würde ich nicht einen eigenen Beitrag erstellen.



  • wartnochaufmailvonadmin schrieb:

    In deinen ersten Codeblock definierst du b und m_button zweimal, warum verstehe ich nicht. Sehe es mal als Fehler an.

    Ja, c&p Fehler 😉

    Auch wen man diesen Fehler bereinigt, funktionieren beide Ansätze nicht. Die Fehlermeldung lautet: |12|error: insufficient contextual information to determine type

    Den Fehler kann ich bei mir nicht nachvollziehen. Wenn ich bei deinem Code den Fehler (hast die Klammern bei signal_clicked vergessen) bereinige, dann kompiliert das astrein und funzt auch:

    #include <gtkmm.h>
    #include <iostream>
    
    class B {
    	public:
        void funktion(){std::cout << "Geht" << std::endl;};
    };
    
    class Fenster : public Gtk::Window {
    	public:
        Gtk::Button m_button;
        B b;
    
    	Fenster() : m_button("Geht") {
            m_button.signal_clicked().connect(sigc::mem_fun(b,&B::funktion));
            add(m_button);
            show_all_children();
    	}
    };
    
    int main(int argc, char *argv[])
    {
        Gtk::Main main_obj(argc, argv);
        Fenster window_obj;
        main_obj.run(window_obj);
        return 0;
    };
    

    Hab das mit gtkmm 2.12.7-1 auf einem Debian 5.0 unstable kompiliert.

    Cheers

    GPC



  • Danke, ich weiß nicht warum es vorher nicht funktioniert hat.
    MfG
    Lukas
    P.s.: Manchmal braucht man nur einen kleinen Antstoss.


Anmelden zum Antworten