====== 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