====== Gtkmm, usare Treeview in modalità liststore ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//29/02/2008//** \\ \\ Il widget Treeview permette di rappresentare diverse modalità di griglie, la più tradizionale si chiama ListStore. {{programmazione:gtkmm:liststore.png|}} 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 della nostra tabella, 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]]. ===== 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; Gtk::Entry entry2; int i; Gtk::Button button1; //La nostra classe personalizzata per specificare il modello di colonne: class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(id); add(nominativo); add(data_nascita); } Gtk::TreeModelColumn id; Gtk::TreeModelColumn nominativo; Gtk::TreeModelColumn data_nascita; }; ModelColumns m_Columns; Gtk::ScrolledWindow m_ScrolledWindow; Gtk::TreeView m_TreeView; Glib::RefPtr m_refTreeModel; 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(); row[m_Columns.data_nascita] = entry2.get_text(); i=i+1; //contatore inserimenti. } public: MainWindow() //nel costruttore disegnamo la finestra { i=0; //contatore degli elementi set_size_request(640, 480); set_title("Esempio TreeView"); add(fisso); //contenitore che permette un posizionamento "al pixel" dei widget fisso.put(button1,260, 80); //posiziono i widget sul contenitore fisso.put(entry1,60, 40); fisso.put(entry2,60, 80); fisso.put(m_ScrolledWindow,60,120); //fisso le cordinate del contenitore del TreeView entry1.set_text("[Inserisci nominativo]"); entry2.set_text("[Inserisci data di nascita]"); 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) ); //Creo il modello del "TreeView" in base alle colonne definite in "m_columns": m_refTreeModel = Gtk::ListStore::create(m_Columns); m_TreeView.set_model(m_refTreeModel); //Aggiungo il TreeView dentro una finestra di scorimento: m_ScrolledWindow.add(m_TreeView); m_ScrolledWindow.set_size_request(500,350); //Le barre di scorrimento della finestra di scorrimento saranno visibili solo //se necessario: m_ScrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); //Aggiungo le colonne del TreeView: m_TreeView.append_column("ID", m_Columns.id); m_TreeView.append_column("Name", m_Columns.nominativo); m_TreeView.append_column("Data di nascita", m_Columns.data_nascita); 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 ===== Interagire con le celle del TreeView ===== Stampa sullo stdout il contenuto del TreeView void on_stampacelle_clicked(){ typedef Gtk::TreeModel::Children type_children; type_children children = m_refTreeModel->children(); for(type_children::iterator iter = children.begin(); iter != children.end(); ++iter) { Gtk::TreeModel::Row row = *iter; //Stampa il contenuto delle celle. std::cout< ===== Il segnale "changed" ===== Viene attivato quando si cambia la riga del treeview: //Connette all'evento signal_changed() l'esecuzione della callback "on_selection_changed" Glib::RefPtr refTreeSelection = m_TreeView.get_selection(); refTreeSelection->signal_changed().connect( sigc::mem_fun(*this, &MainWindow::on_selection_changed) ); m_TreeViev è il widget "tabella" in figura. ===== Cancellare righe dal TreeView ===== Cancella la riga selezionata dal TreeView.\\ In precedenza nella nostra classe abbiamo dichiarato e assegnatole seguenti cose (vedi sopra): ... Gtk::TreeView m_TreeView; Glib::RefPtr m_refTreeModel; ModelColumns m_Columns; //Creo il modello del "TreeView" in base alle colonne definite in "m_columns": m_refTreeModel = Gtk::ListStore::create(m_Columns); m_TreeView.set_model(m_refTreeModel); ... Ecco la callback che si occupa della cancellazione della riga selezionata (si presuppone l'esistenza di un bottone chiamato elimina che sopra non abbiamo creato): void on_elimina_clicked(){ Glib::RefPtr refTreeSelection = m_TreeView.get_selection(); Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) //se qualcosa è selezionato { m_refTreeModel->Gtk::ListStore::erase(iter); } }