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

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


Anmelden zum Antworten