Agregamos un combo complejo que admite elementos con valor (entero) y texto (string). Para aceptar esta estructura se la debe definir en un modelo e indicarle al combo que auspicie de vista para el mismo. Ver el tutorial de gtkmm para entender el concepto de view-model utilizado en este tipo de controles.
Utilizamos la señal changed para mostrar el elemento elegido por el usuario a través de la salida estándar.
#include <gtkmm.h>
#include <iostream>
//Clase que mantiene la estructura del modelo a utilizar en el combo
class ColumnasModelo: public Gtk::TreeModel::ColumnRecord{
private:
Gtk::TreeModelColumn<int> columnaValor;
Gtk::TreeModelColumn<Glib::ustring> columnaTexto;
public:
ColumnasModelo(){
//El modelo tendrá dos columnas: la primera con el valor entero, la segunda con el texto string unicode.
add(columnaValor);
add(columnaTexto);
}
Gtk::TreeModelColumn<int>& getColumnaValor(){
return columnaValor;
}
Gtk::TreeModelColumn<Glib::ustring>& getColumnaTexto(){
return columnaTexto;
}
};
//Función callback para la señal changed del combo. Muestra el valor actual por salida estándar
void on_combo_changed(Gtk::ComboBox* combo, ColumnasModelo* columnas){
if (combo->get_active()){
Gtk::TreeModel::Row fila = *combo->get_active();
std::cout << "Elemento elegido: " << fila[columnas->getColumnaTexto()] << " con valor: " << fila[columnas->getColumnaValor()] << std::endl;
}
}
int main(int argc, char* argv[]){
//Inicializamos el framework
Gtk::Main kit(argc, argv);
//Creamos las columnas, el modelo y el combo que en este caso será la vista para el modelo planteado
ColumnasModelo columnas;
Glib::RefPtr<Gtk::ListStore> modelo = Gtk::ListStore::create(columnas);
Gtk::ComboBox combo;
//Establecemos el modelo del combo e indicamos las columnas a mostrar
combo.set_model(modelo);
//No es necesario agregar la columna valor si sólo queremos mostrar el texto
//combo.pack_start(columnas.getColumnaValor());
combo.pack_start(columnas.getColumnaTexto());
//Agregamos las filas
Gtk::TreeModel::Row fila = *(modelo->append());
fila[columnas.getColumnaValor()] = 1;
fila[columnas.getColumnaTexto()] = "Texto 1";
fila = *(modelo->append());
fila[columnas.getColumnaValor()] = 2;
fila[columnas.getColumnaTexto()] = "Texto 2";
//Conectamos un callback a la señal changed del combo
combo.signal_changed().connect(sigc::bind(sigc::ptr_fun(&on_combo_changed), &combo, &columnas));
//Creamos la ventana, agregamos el combo y mostramos el contenido
Gtk::Window ventana;
ventana.add(combo);
ventana.show_all();
//Iniciamos el loop de eventos
Gtk::Main::run(ventana);
return 0;
}