====== 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** 1 Fabio Di Matteo 50 2 Tizio Rossi 10 406 True False True True False vertical True True False True 0 500 415 True True in True True myListstore True 1 True ID 0 Nome 1 Gradimento 2 False True 1 True False GtkTreeview e Glade Come usare il treeview con glade True True False gtk-add True True True True True False True 0 gtk-delete True True True True True False True 1 gtk-save True True True True True False True 2 gtk-clear True True True True True False True 3 **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(); }