A combo box is a drop-down list allowing you to choose one option from a list of options.
A WComboBox corresponds to an HTML <select>
element.
WComboBox
is a View widget (see also
Model-View-Controller)
which instantiates its own
WStringListModel
by default. You can use this widget also in
conjunction with another model.
You can capture the selected item and deal with it using a signal/slot mechanism.
#include <Wt/WComboBox.h>
#include <Wt/WContainerWidget.h>
#include <Wt/WText.h>
auto container = std::make_unique<Wt::WContainerWidget>();
auto cb = container->addNew<Wt::WComboBox>();
cb->addItem("Heavy");
cb->addItem("Medium");
cb->addItem("Light");
cb->setCurrentIndex(1); // Show 'Medium' initially.
cb->setMargin(10, Wt::Side::Right);
auto out = container->addNew<Wt::WText>();
out->addStyleClass("help-block");
cb->changed().connect([=] {
out->setText(Wt::WString("You selected {1}.")
.arg(cb->currentText()));
});
WComboBox is an MVC class (model-view-controller). By default a
WStringListModel is used. With this model you can associate a
single column of data to the displayed items. The member methods
addItem()
, insertItem()
and removeItem()
manipulate the model. You can set the model with setModel()
.
Item models support different roles like
Wt::ItemDataRole::DisplayRole
and
Wt::ItemDataRole::UserRole
. The text for an item in the
drop-down box is associated with a
Wt::ItemDataRole::DisplayRole
. Typically, you will associate the
underlying "value" with a Wt::ItemDataRole::UserRole
). In this
way, you can also add additional user roles.
Note that there are still other models like WFormModel which and can be used to represent fields in a form.
#include <Wt/WAny.h>
#include <Wt/WComboBox.h>
#include <Wt/WContainerWidget.h>
#include <Wt/WStringListModel.h>
#include <Wt/WText.h>
auto container = std::make_unique<Wt::WContainerWidget>();
auto cb = container->addNew<Wt::WComboBox>();
cb->setMargin(10, Wt::Side::Right);
auto model = std::make_shared<Wt::WStringListModel>();
model->addString("Belgium");
model->setData(0, 0, std::string("BE"), Wt::ItemDataRole::User);
model->addString("Netherlands");
model->setData(1, 0, std::string("NL"), Wt::ItemDataRole::User);
model->addString("United Kingdom");
model->setData(2, 0, std::string("UK"), Wt::ItemDataRole::User);
model->addString("United States");
model->setData(3, 0, std::string("US"), Wt::ItemDataRole::User);
model->setFlags(3, Wt::ItemFlag::Selectable);
cb->setNoSelectionEnabled(true);
cb->setModel(model);
auto out = container->addNew<Wt::WText>();
out->addStyleClass("help-block");
cb->changed().connect([=] {
Wt::WString countryName = cb->currentText();
int row = cb->currentIndex();
Wt::WString countryCode = Wt::asString(model->data(model->index(row,0), Wt::ItemDataRole::User));
out->setText(Wt::WString("You selected {1} with key {2}.").
arg(countryName).arg(countryCode));
});