Forms — widgets and support classes for capturing user information
Wt provides different kinds of button widgets. The WRadioButton class provides options which are usually mutually exclusive in contrast to WCheckBoxs which provide independent on/off options.
An instance of WRadioButton corresponds to an HTML <input type="radio"> element.
Use a WButtonGroup to group together radio buttons that reflect options that are mutually exclusive. With event handling you can follow up any change in the selection.
By default, radio buttons are inline. You will need to use setInline(false) to let them stack vertically.
Usually, you'll group a set of radio buttons together in a WButtonGroup, so that only one can be selected at a time.
#include <Wt/WButtonGroup.h>
#include <Wt/WContainerWidget.h>
#include <Wt/WRadioButton.h>
#include <Wt/WTemplate.h>
auto container = Wt::cpp14::make_unique<Wt::WContainerWidget>();
auto group = std::make_shared<Wt::WButtonGroup>();
Wt::WRadioButton *button;
button = container->addNew<Wt::WRadioButton>("Radio me!");
group->addButton(button);
button = container->addNew<Wt::WRadioButton>("No, radio me!");
group->addButton(button);
button = container->addNew<Wt::WRadioButton>("Nono, radio me!");
group->addButton(button);
group->setSelectedButtonIndex(0); // Select the first button by default.
Since by default, radio buttons are inline, you will need to use setInline(false) to let them stack vertically.
#include <Wt/WButtonGroup.h>
#include <Wt/WContainerWidget.h>
#include <Wt/WRadioButton.h>
auto container = Wt::cpp14::make_unique<Wt::WContainerWidget>();
auto group = std::make_shared<Wt::WButtonGroup>();
Wt::WRadioButton *button;
button = container->addNew<Wt::WRadioButton>("Radio me!");
button->setInline(false);
group->addButton(button);
button = container->addNew<Wt::WRadioButton>("No, radio me!");
button->setInline(false);
group->addButton(button);
button = container->addNew<Wt::WRadioButton>("Nono, radio me!");
button->setInline(false);
group->addButton(button);
group->setSelectedButtonIndex(0); // Select the first button by default.
You can process a new selection with a signal/slot mechanism. In the example below the signal checkedChanged() of the WButtonGroup is passed to an inner function passing a WPushButton. You can see that there are two ways to get the id assigned to a button, namely group->id(selection) and group->checkedId().
#include <Wt/WButtonGroup.h>
#include <Wt/WContainerWidget.h>
#include <Wt/WRadioButton.h>
#include <Wt/WString.h>
#include <Wt/WText.h>
auto container = Wt::cpp14::make_unique<Wt::WContainerWidget>();
auto group = std::make_shared<Wt::WButtonGroup>();
Wt::WRadioButton *rb;
rb = container->addNew<Wt::WRadioButton>("sleeping");
rb->setInline(false);
group->addButton(rb, 1);
rb = container->addNew<Wt::WRadioButton>("eating");
rb->setInline(false);
group->addButton(rb, 2);
rb = container->addNew<Wt::WRadioButton>("driving");
rb->setInline(false);
group->addButton(rb, 3);
rb = container->addNew<Wt::WRadioButton>("learning Wt");
rb->setInline(false);
group->addButton(rb, 4);
group->setSelectedButtonIndex(0); // Select the first button by default.
Wt::WText *out = container->addNew<Wt::WText>();
// Use a raw pointer inside the lambda to prevent memory leak
auto rawGroup = group.get();
group->checkedChanged().connect([=] (Wt::WRadioButton *selection) {
Wt::WString text;
switch (rawGroup->id(selection)) {
case 1: text = Wt::WString("You checked button {1}.")
.arg(rawGroup->checkedId());
break;
case 2: text = Wt::WString("You selected button {1}.")
.arg(rawGroup->checkedId());
break;
case 3: text = Wt::WString("You clicked button {1}.")
.arg(rawGroup->checkedId());
break;
}
text += Wt::WString("... Are your really {1} now?")
.arg(selection->text());
if (rawGroup->id(selection) == 4)
text = Wt::WString("That's what I expected!");
out->setText(Wt::WString("<p>") + text + "</p>");
});