RadioButton
| Chapter 6. Buttons |

## RadioButton

Like check buttons, 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 constructors without a `Gtk::RadioButton::Group` parameter 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;
      auto m_rb1 = Gtk::make_managed<Gtk::RadioButton>(group, "button1");
      auto m_rb2 = Gtk::make_managed<Gtk::RadioButton>(group, "button2");
      auto 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 6.3. RadioButton

Source Code

File: `radiobuttons.h` (For use with gtkmm 4)

    #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: `radiobuttons.cc` (For use with gtkmm 4)

    #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");

      // 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.add(m_Box1);
      m_Box_Top.add(m_Separator);
      m_Box_Top.add(m_Box2);
      m_Separator.set_expand();

      // Set the inner boxes' margins
      m_Box1.set_margin(10);
      m_Box2.set_margin(10);

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

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

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

      // 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) );
    }

    RadioButtons::~RadioButtons()
    {
    }

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

File: `main.cc` (For use with gtkmm 4)

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

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

      RadioButtons buttons;

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

CheckButton |  | Chapter 7. Range Widgets