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