====== Usare il Gtk::TreeView con Glade======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//20/02/2018 - 12:05//** \\ \\
{{:programmazione:gtkmm:gtkmm-treeview-glade.png|}}
E' possibile risparmiare tempo e tante righe di codice "disegnando" il treeview, il list store e l'intera grafica della nostra gui con l'editor di interfaccie Glade. Di seguito il codice commentato.
**gui.ui**
**main.cpp**
#include
#include "mainwindow.hpp"
int main(int argc, char *argv[])
{
auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
mainWindow mainw;
return app->run(*mainw.window1);
}
**mainwindow.hpp**
#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP
#include
class mainWindow
{
public:
Glib::RefPtr builder;
Gtk::Window *window1;
Gtk::TreeView *treeView;
Glib::RefPtr listStore;
Gtk::Entry *entry;
Gtk::Button *add, *del, *save, *clear;
mainWindow();
protected:
void on_add_clicked();
void on_delete_clicked();
void on_save_clicked();
void on_selection_changed();
void on_clear_clicked();
private:
/* add your private declarations */
};
#endif /* MAINWINDOW_HPP */
**mainwindow.cpp**
#include "mainwindow.hpp"
#include
mainWindow::mainWindow()
{
auto builder = Gtk::Builder::create();
try
{
builder->add_from_resource("/app/res/gui.ui");
}
catch(const Glib::FileError& ex)
{
std::cerr << "FileError: " << ex.what() << std::endl;
}
catch(const Glib::MarkupError& ex)
{
std::cerr << "MarkupError: " << ex.what() << std::endl;
}
catch(const Gtk::BuilderError& ex)
{
std::cerr << "BuilderError: " << ex.what() << std::endl;
}
builder->get_widget("window1", window1);
builder->get_widget("myTreeView",treeView);
listStore = Glib::RefPtr::cast_dynamic(builder->get_object("myListstore"));
builder->get_widget("entry",entry);
builder->get_widget("btAdd",add);
builder->get_widget("btDel",del);
builder->get_widget("btSave",save);
builder->get_widget("btClear",clear);
//Connetto i bottoni alle callbacks
add->signal_clicked().connect(sigc::mem_fun(*this, &mainWindow::on_add_clicked) );
del->signal_clicked().connect(sigc::mem_fun(*this, &mainWindow::on_delete_clicked) );
save->signal_clicked().connect(sigc::mem_fun(*this, &mainWindow::on_save_clicked) );
clear->signal_clicked().connect(sigc::mem_fun(*this, &mainWindow::on_clear_clicked) );
//Connetto le callbacks per il Treeview (cambio di selezione riga)
Glib::RefPtr refTreeSelection = treeView->get_selection();
refTreeSelection->signal_changed().connect( sigc::mem_fun(*this,&mainWindow::on_selection_changed) );
}
//Aggiunge una riga al liststore
void mainWindow::on_add_clicked()
{
static double gradimento=0;
static int i ;
i++;
gradimento=gradimento+0.8;
//La nostra classe personalizzata per specificare il modello di colonne:
class ModelColumns : public Gtk::TreeModel::ColumnRecord
{
public:
ModelColumns()
{ add(id); add(nome); add(gradimento); }
Gtk::TreeModelColumn id;
Gtk::TreeModelColumn nome;
Gtk::TreeModelColumn gradimento;
};
ModelColumns m_Columns;
//Aggiungo le righe al liststore
Gtk::TreeModel::Row row = *(listStore->append());
row[m_Columns.id] = i;
row[m_Columns.nome] = entry->get_text();
row[m_Columns.gradimento] = gradimento;
}
void mainWindow::on_delete_clicked()
{
Glib::RefPtr refTreeSelection = treeView->get_selection();
Gtk::TreeModel::iterator iter = refTreeSelection->get_selected();
if(iter) //se qualcosa รจ selezionato
{
listStore->Gtk::ListStore::erase(iter);
}
}
void mainWindow::on_save_clicked()
{
std::string nome;
nome=entry->get_text();
//Ricavo il valore di una riga selezionata
Glib::RefPtr refTreeSelection = treeView->get_selection();
Gtk::TreeModel::iterator iter = refTreeSelection->get_selected();
if(iter)
{
//Prelevo il valore di una cella al click e lo salvo
Gtk::TreeModel::Row row = *iter;
row.set_value (1, nome );
}
}
void mainWindow::on_selection_changed()
{
std::string nome;
//Ricavo il valore di una riga selezionata
Glib::RefPtr refTreeSelection = treeView->get_selection();
Gtk::TreeModel::iterator iter = refTreeSelection->get_selected();
if(iter)
{
//Prelevo il valore di una cella al click e lo scrivo sulla entry
Gtk::TreeModel::Row row = *iter;
row.get_value (1, nome );
entry->set_text(nome);
}
}
void mainWindow::on_clear_clicked()
{
listStore->clear();
}