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.
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: 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; 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<unsigned int> id; Gtk::TreeModelColumn<Glib::ustring> nominativo; Gtk::TreeModelColumn<Glib::ustring> data_nascita; }; ModelColumns m_Columns; Gtk::ScrolledWindow m_ScrolledWindow; Gtk::TreeView m_TreeView; Glib::RefPtr<Gtk::ListStore> 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() { } };
#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
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<<row[m_Columns.id]; std::cout<<row[m_Columns.nominativo]; std::cout<<row[m_Columns.data_nascita]::endl; } }
Viene attivato quando si cambia la riga del treeview:
//Connette all'evento signal_changed() l'esecuzione della callback "on_selection_changed" Glib::RefPtr<Gtk::TreeSelection> refTreeSelection = m_TreeView.get_selection(); refTreeSelection->signal_changed().connect( sigc::mem_fun(*this, &MainWindow::on_selection_changed) );
m_TreeViev è il widget “tabella” in figura.
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<Gtk::ListStore> 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<Gtk::TreeSelection> refTreeSelection = m_TreeView.get_selection(); Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) //se qualcosa è selezionato { m_refTreeModel->Gtk::ListStore::erase(iter); } }