====== 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);
}
}