Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema!! c++ gtkmm

Estas en el tema de Problema!! c++ gtkmm en el foro de C/C++ en Foros del Web. El asunto es el siguiente. Estoy haciendo un programa, que muestre en la pantalla un esquema en árbol en c++ con las librerias de gtkmm, ...
  #1 (permalink)  
Antiguo 25/04/2013, 06:09
 
Fecha de Ingreso: abril-2013
Mensajes: 1
Antigüedad: 11 años
Puntos: 0
Mensaje Problema!! c++ gtkmm

El asunto es el siguiente. Estoy haciendo un programa, que muestre en la pantalla un esquema en árbol en c++ con las librerias de gtkmm, es decir interfaz gráfica.
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.

Etiquetas: funcion, int, programa, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:49.