RadioButton
| Chapter 5. Buttons |

## RadioButton

Like checkboxes, radio buttons also inherit from `Gtk::ToggleButton`, but these work in groups, and only one RadioButton in a group can be selected at any one time.

### Groups

There are two ways to set up a group of radio buttons. The first way is to create the buttons, and set up their groups afterwards. Only the first two constructors are used. In the following example, we make a new window class called `RadioButtons`, and then put three radio buttons in it:

    class RadioButtons : public Gtk::Window
    {
    public:
      RadioButtons();

    protected:
      Gtk::RadioButton m_rb1, m_rb2, m_rb3;
    };

    RadioButtons::RadioButtons()
    : m_rb1("button1"),
      m_rb2("button2"),
      m_rb3("button3")
    {
      m_rb2.join_group(m_rb1);
      m_rb3.join_group(m_rb1);
    }

We told gtkmm to put all three `RadioButton`s in the same group by using `join_group()` to tell the other `RadioButton`s to share group with the first `RadioButton`.

Note that you can't do

    m_rb2.set_group(m_rb1.get_group()); //doesn't work

because `get_group()` returns a `RadioButton::Group` which is modified by `set_group()` and therefore is non-const.

The second way to set up radio buttons is to make a group first, and then add radio buttons to it. Here's an example:

    class RadioButtons : public Gtk::Window
    {
    public:
      RadioButtons();
    };

    RadioButtons::RadioButtons()
    {
      Gtk::RadioButton::Group group;
      Gtk::RadioButton* m_rb1 = Gtk::make_managed<Gtk::RadioButton>(group, "button1");
      Gtk::RadioButton* m_rb2 = Gtk::make_managed<Gtk::RadioButton>(group, "button2");
      Gtk::RadioButton* m_rb3 = Gtk::make_managed<Gtk::RadioButton>(group, "button3");
    }

We made a new group by simply declaring a variable, `group`, of type `Gtk::RadioButton::Group`. Then we made three radio buttons, using a constructor to make each of them part of `group`.

### Methods

`RadioButtons` are "off" when created; this means that when you first make a group of them, they will all be off. Don't forget to turn one of them on using `set_active()`:

Reference

### Example

The following example demonstrates the use of `RadioButton`s:

Figure 5.3. RadioButton

Source Code

File: `radiobuttons.h` (For use with gtkmm 3, not gtkmm 2)

    #ifndef GTKMM_EXAMPLE_RADIOBUTTONS_H
    #define GTKMM_EXAMPLE_RADIOBUTTONS_H

    #include <gtkmm/box.h>
    #include <gtkmm/window.h>
    #include <gtkmm/radiobutton.h>
    #include <gtkmm/separator.h>

    class RadioButtons : public Gtk::Window
    {
    public:
      RadioButtons();
      virtual ~RadioButtons();

    protected:
      //Signal handlers:
      void on_button_clicked();

      //Child widgets:
      Gtk::Box m_Box_Top, m_Box1, m_Box2;
      Gtk::RadioButton m_RadioButton1, m_RadioButton2, m_RadioButton3;
      Gtk::Separator m_Separator;
      Gtk::Button m_Button_Close;
    };

    #endif //GTKMM_EXAMPLE_RADIOBUTTONS_H

File: `main.cc` (For use with gtkmm 3, not gtkmm 2)

    #include "radiobuttons.h"
    #include <gtkmm/application.h>

    int main(int argc, char *argv[])
    {
      auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

      RadioButtons buttons;

      //Shows the window and returns when it is closed.
      return app->run(buttons);
    }

File: `radiobuttons.cc` (For use with gtkmm 3, not gtkmm 2)

    #include "radiobuttons.h"

    RadioButtons::RadioButtons() :
      m_Box_Top(Gtk::ORIENTATION_VERTICAL),
      m_Box1(Gtk::ORIENTATION_VERTICAL, 10),
      m_Box2(Gtk::ORIENTATION_VERTICAL, 10),
      m_RadioButton1("button1"),
      m_RadioButton2("button2"),
      m_RadioButton3("button3"),
      m_Button_Close("close")
    {
      // Set title and border of the window
      set_title("radio buttons");
      set_border_width(0);

      // Put radio buttons 2 and 3 in the same group as 1:
      m_RadioButton2.join_group(m_RadioButton1);
      m_RadioButton3.join_group(m_RadioButton1);

      // Add outer box to the window (because the window
      // can only contain a single widget)
      add(m_Box_Top);

      //Put the inner boxes and the separator in the outer box:
      m_Box_Top.pack_start(m_Box1);
      m_Box_Top.pack_start(m_Separator);
      m_Box_Top.pack_start(m_Box2);

      // Set the inner boxes' borders
      m_Box2.set_border_width(10);
      m_Box1.set_border_width(10);

      // Put the radio buttons in Box1:
      m_Box1.pack_start(m_RadioButton1);
      m_Box1.pack_start(m_RadioButton2);
      m_Box1.pack_start(m_RadioButton3);

      // Set the second button active
      m_RadioButton2.set_active();

      // Put Close button in Box2:
      m_Box2.pack_start(m_Button_Close);

      // Make the button the default widget
      m_Button_Close.set_can_default();
      m_Button_Close.grab_default();

      // Connect the clicked signal of the button to
      // RadioButtons::on_button_clicked()
      m_Button_Close.signal_clicked().connect(sigc::mem_fun(*this,
                  &RadioButtons::on_button_clicked) );

      // Show all children of the window
      show_all_children();
    }

    RadioButtons::~RadioButtons()
    {
    }

    void RadioButtons::on_button_clicked()
    {
      hide(); //to close the application.
    }

CheckButton |  | Chapter 6. Range Widgets