Mi programa me crea problemas de actualización del árbol. Si que me lo construye, pero los datos que insertes en el constructor serán los que aparezcan durante toda su ejecución.
Por lo que he hecho 2 códigos más simples para analizar el error a fondo, y he podido observar que haciendo el programa de esta manera me funciona correctamente:
Cita:
MAIN.CPP
Código:
#include "examplewindow.h" #include <gtkmm/application.h> int main(int argc, char *argv[]) { Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example"); ExampleWindow window; //Shows the window and returns when it is closed. return app->run(window); }
Cita:
EXAMPLEWINDOW.H
Código:
#ifndef GTKMM_EXAMPLEWINDOW_H #define GTKMM_EXAMPLEWINDOW_H #include <glibmm.h> #include <gdkmm.h> #include <gtkmm.h> class ExampleWindow : public Gtk::Window { public: ExampleWindow(); virtual ~ExampleWindow(); private: void add_entry(int line, float l_nois); // Signal handlers virtual void on_button_quit(); virtual void on_button_delete(); virtual void on_selection_changed(); // Types and classes typedef Glib::RefPtr<Gdk::Pixbuf> PixbufPtr; class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_number_of_lines);add(m_col_level_noise); } Gtk::TreeModelColumn<int> m_number_of_lines; Gtk::TreeModelColumn<float> m_col_level_noise; }; // Private members ModelColumns m_Columns; Gtk::VBox m_VBox; Gtk::ScrolledWindow m_ScrolledWindow; Gtk::TreeView m_TreeView; Glib::RefPtr<Gtk::ListStore> m_refTreeModel; Glib::RefPtr<Gtk::TreeSelection> m_refTreeSelection; Gtk::HButtonBox m_ButtonBox; Gtk::Button m_Button_Quit; Gtk::Button m_Button_Delete; }; #endif //GTKMM_EXAMPLEWINDOW_H
Cita:
EXAMPLEWINDOW.CPP
Código:
#include <iostream> #include "examplewindow.h" static int num=0; static int number_of_meters; static float noise; struct TreeEntry { int m_number_of_lines; float m_level_noise; TreeEntry( const int line, const float l_nois) :m_number_of_lines(line),m_level_noise(l_nois) {} }; //Debemos inicializarlo TreeEntry g_entries[]= { TreeEntry(0, 0) }; ExampleWindow::ExampleWindow() : m_Button_Quit("Add"), m_Button_Delete("Delete") { set_title("Gtk::TreeView (TreeStore) example"); set_border_width(5); set_default_size(800, 600); add(m_VBox); //Add the TreeView, inside a ScrolledWindow, with the button underneath: m_ScrolledWindow.add(m_TreeView); //Only show the scrollbars when they are necessary: m_ScrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); m_VBox.pack_start(m_ScrolledWindow); m_VBox.pack_start(m_ButtonBox, Gtk::PACK_SHRINK); m_ButtonBox.pack_start(m_Button_Quit, Gtk::PACK_SHRINK); m_ButtonBox.pack_start(m_Button_Delete, Gtk::PACK_SHRINK); m_ButtonBox.set_border_width(5); m_ButtonBox.set_layout(Gtk::BUTTONBOX_END); m_Button_Quit.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_button_quit) ); m_Button_Delete.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_button_delete) ); m_Button_Delete.set_sensitive( false ); // Only activate if row selected //Create the Tree model: m_refTreeModel = Gtk::ListStore::create(m_Columns); m_TreeView.set_model(m_refTreeModel); //All the items to be reordered with drag-and-drop: m_TreeView.set_reorderable(); m_TreeView.set_rules_hint(); m_TreeView.set_headers_clickable(true); m_TreeView.set_headers_visible(true); // Handle tree selections // m_refTreeSelection = m_TreeView.get_selection(); m_refTreeSelection->signal_changed().connect( sigc::mem_fun(*this, &ExampleWindow::on_selection_changed) ); //Add the TreeView's view columns: m_TreeView.append_column("Number of meters", m_Columns.m_number_of_lines); m_TreeView.append_column("Type of noise", m_Columns.m_col_level_noise); show_all_children(); } ExampleWindow::~ExampleWindow() { } void ExampleWindow::add_entry(int line, float l_nois) { Gtk::TreeModel::Row row = *(m_refTreeModel->append()); row[m_Columns.m_number_of_lines] = line; row[m_Columns.m_col_level_noise] = l_nois; } void ExampleWindow::on_button_quit() { printf("Number of meters:\n"); scanf("%d",&number_of_meters); printf("Noise:\n"); scanf("%f",&noise); g_entries[0]=TreeEntry( number_of_meters, noise); add_entry( g_entries[0].m_number_of_lines, g_entries[0].m_level_noise ); } void ExampleWindow::on_button_delete() { Gtk::TreeModel::iterator store_iter = m_refTreeSelection->get_selected(); m_refTreeModel->erase( store_iter ); } void ExampleWindow::on_selection_changed() { m_Button_Delete.set_sensitive( m_refTreeSelection->count_selected_rows() > 0 ); }
En cambio, en cuanto divido el código en más .cpp y .h , deja de actualizarse.
No tengo claro si el problema es que falta algún puntero, o algún otro error que pueda haber cometido por falta de conocimientos o si hay necesidad de meter threads para el árbol.
Os copio el otro código por si a alguien se le ocurre algo, que llevo semanas sin ver.
Gracias por anticipado.