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.
#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() { } };
#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; }
CPP = g++ OPTS = `pkg-config --cflags --libs gtkmm-2.4` all: $(CPP) main.cc -o main $(OPTS) clean: rm main