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.
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
.
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()
.
The following example demonstrates the use of
RadioButton
s:
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); }