====== Gtkmm, usare i Combobox ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//17/02/2008//** \\ \\
Di seguito il codice della classe commentato. In verita ci sono due classi, quella che realizza tutta la finestra e la piccolissima classe che specifica le colonne del nostro combobox, tutte e due le classi sono state accorpate in un unico file, potevano essere spezzate in due file magari uno contenente le intestazioni e l'altro le implementazioni, come si รจ fatto in questo articolo: [[programmazione:gtkmm:classe_esempio]]. \\
{{programmazione:gtkmm:combobox.png|}}
===== La classe della nostra finestra =====
#include
#include
class MainWindow : public Gtk::Window
{
protected: //le dichiarazioni dei widget e i metodi callbacks come "protetti"
Gtk::Fixed fisso;
Gtk::Entry entry1;
int i;
Gtk::Button button1;
//dichiarazione del widget combobox e della lista contenitrice dei dati.
Gtk::ComboBox m_Combo;
Glib::RefPtr m_refTreeModel;
//La nostra classe personalizzata per specificare il modello di colonne:
class ModelColumns : public Gtk::TreeModel::ColumnRecord
{
public:
ModelColumns()
{ add(id); add(nominativo); }
Gtk::TreeModelColumn id;
Gtk::TreeModelColumn nominativo;
};
ModelColumns m_Columns;
void on_button1_clicked()
{
//Aggiamo record alla struttura
Gtk::TreeModel::Row row = *(m_refTreeModel->append());
row[m_Columns.id] = i;
row[m_Columns.nominativo] = entry1.get_text();
i=i+1; //contatore inserimenti.
}
void on_combo_changed() //quando viene selezionato un valore dal ComboBox
{
Gtk::TreeModel::iterator iter = m_Combo.get_active();
if(iter)
{
Gtk::TreeModel::Row row = *iter;
if(row)
{
//Prendi i dati dalla riga selezionata:
//e li scrive sullo stdout
int id = row[m_Columns.id];
Glib::ustring nominativo = row[m_Columns.nominativo];
std::cout << " ID=" << id << ", nominativo=" << nominativo << std::endl;
}
}else{
std::cout << "Scelta non valida." << std::endl;
}
}
public:
MainWindow() //nel costruttore disegnamo la finestra
{
i=0; //contatore degli elementi
set_size_request(320, 240);
set_title("Esempio ComboBox");
add(fisso); //contenitore che permette un posizionamento "al pixel" dei widget
fisso.put(button1,160, 70); //posiziono i widget sul contenitore
fisso.put(entry1,60, 40);
fisso.put(m_Combo,60,120); //fisso le cordinate del ComboBox
entry1.set_text("[Inserisci nominativo]");
button1.set_label("Aggiungi");
//collego al click del bottone l'esecuzione del metodo on_button1_clicked()
button1.signal_clicked().connect( sigc::mem_fun(*this,
&MainWindow::on_button1_clicked) );
//collego alla selezione di un elemento del combobox l'esecuzione del metodo on_combo_changed()
m_Combo.signal_changed().connect( sigc::mem_fun(*this, &MainWindow::on_combo_changed) );
//Creo il tipo di lista del "Combo" in base alle colonne definite in "m_columns"
//e la applico al combo stesso:
m_refTreeModel = Gtk::ListStore::create(m_Columns);
m_Combo.set_model(m_refTreeModel);
//Aggiungo il modello delle colonne al Combo:
m_Combo.pack_start(m_Columns.id);
m_Combo.pack_start(m_Columns.nominativo);
show_all_children();
}
~MainWindow()
{
}
};
===== Il Main =====
#include
#include "main_window.cc"
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
MainWindow window1;
Gtk::Main::run(window1);
return 0;
}
===== Il Makefile =====
CPP = g++
OPTS = `pkg-config --cflags --libs gtkmm-2.4`
all:
$(CPP) main.cc -o main $(OPTS)
clean:
rm main