Barra laterale

programmazione:gtkmm:treeview-liststore

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.

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.

La classe della nostra finestra

#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()
{
}
 
 
 
};

Il Main

#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;
}

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<<row[m_Columns.id]; 
			std::cout<<row[m_Columns.nominativo];
  			std::cout<<row[m_Columns.data_nascita]::endl; 
		}
	}

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

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

programmazione/gtkmm/treeview-liststore.txt · Ultima modifica: 18/04/2018 - 15:49 (modifica esterna)