Indice

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: Una classe di esempio con Gtkmm.

La classe della nostra finestra

#include <iostream>
#include <gtkmm.h>
 
 
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<Gtk::ListStore> 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<unsigned int> id;
    		Gtk::TreeModelColumn<Glib::ustring> 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 <gtkmm/main.h>
#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