[gtkmm] RadioButtons mit SignalHandler
-
Folgendes Problem:
Ich möchte das Ändern von RadioButtons sofort erfassen und verarbeiten. Dazu habe ich die RadioButtons Gruppiert und diese Gruppe einem RadioAction zugewiesen. Mittels connect() möchte ich signal_changed() von RadioAction, mit einer Funktion verbinden. Dies Funktioniert leider nicht. Das Programm lässt sich zwar fehlerfrei compilieren, doch beim Ausführen gibt es sofort einen "Segmentation fault". Zum Demonstrieren habe ich ein Beispielprogramm geschrieben, dass sich genauso verhält. Das Problem liegt wahrscheinlich beim verbinden von RadioAction mit der Funktion mittels connect.Ein paar Referenzen zum besseren Verständnis:
Gtk::RadioButton
Gtk::RadioButtonGroup
Gtk::RadioAction
Glib::SignalProxy1< R, P1 >
Handbuch: Writing signal handlersDer Beispielcode:
/************************* GTKmm - Radiobutton-TEST m_power 26 Januar 2009 main.cc *************************/ #include <iostream> #include <gtkmm-2.4/gtkmm.h> /*** Class Window Main ***/ class class_window_main : public Gtk::Window{ public: class_window_main(); virtual ~class_window_main(){}; // Inline-Destruktor protected: // Widgets Gtk::RadioButton radiobutton1, radiobutton2, radiobutton3; Gtk::VBox vbox1; // RadioButton Group Gtk::RadioButton::Group group_radiobuttons; // RadioAction Glib::RefPtr<Gtk::RadioAction> ref_radioaction; // Signal Handlers virtual void on_radioaction(const Glib::RefPtr<Gtk::RadioAction>&); }; /*** Konstruktor Window Main ***/ class_window_main::class_window_main() : vbox1(false, 5), radiobutton1("Case 1"), radiobutton2("Case 2"), radiobutton3("Case 3"){ // Window set_title("Radiobutton - TEST"); set_default_size(150, 200); set_border_width(5); // Widgets vbox1.add(radiobutton1); vbox1.add(radiobutton2); vbox1.add(radiobutton3); add(vbox1); // Grouping Radiobuttons group_radiobuttons = radiobutton1.get_group(); radiobutton2.set_group(group_radiobuttons); radiobutton3.set_group(group_radiobuttons); radiobutton1.set_active(); // Set RadioAction ref_radioaction = Gtk::RadioAction::create(); ref_radioaction->set_group(group_radiobuttons); // Connecting SignalHandler ref_radioaction->signal_changed().connect(sigc::mem_fun(*this, &class_window_main::on_radioaction)); // Run show_all_children(); return; } // Singalhandler void class_window_main::on_radioaction(const Glib::RefPtr<Gtk::RadioAction> &test_radioaction){ if(radiobutton1.property_active() == true) std::cout << std::endl << "Case1"; if(radiobutton2.property_active() == true) std::cout << std::endl << "Case2"; if(radiobutton3.property_active() == true) std::cout << std::endl << "Case3"; return; } /*** Main-Funktion ***/ int main(int argc, char *argv[]){ Gtk::Main kit(argc, argv); class_window_main window_main; Gtk::Main::run(window_main); return 0; }
Hat jemand einen Tipp für mich?
Vielen Dank im Voraus!Schöne Grüße,
m_power
-
Der Absturz ist in Zeile 62. Probier mal einer der RadioAction::create()-Funktionen mit Parametern. In den Beispielen und dem, was Google-Codesearch findet, wird jedenfalls nirgends create() ohne Parameter benutzt und dokumentiert ist sie auch nicht wirklich.
-
fdsa schrieb:
Der Absturz ist in Zeile 62. Probier mal einer der RadioAction::create()-Funktionen mit Parametern. In den Beispielen und dem, was Google-Codesearch findet, wird jedenfalls nirgends create() ohne Parameter benutzt und dokumentiert ist sie auch nicht wirklich.
Der Fehler liegt hier irgendwo!
ref_radioaction = Gtk::RadioAction::create(group_radiobuttons, "radioaction_name", "radioaction_label", "radioaction_tooltip");
Das hat leider auch nicht funktioniert: Segmentation fault. Eigentlich gibt es create() auch ohne Parameter: Gtk::RadioAction Class Reference.
Vielen Dank!
Auch für den Tip mit Google-Code.