Re: [DUDA] GTK+



On Tue, 2008-02-12 at 23:24 -0300, Sebastian Gonzalez wrote:
> Hola:
> me llamo sebastian gonzalez, llevo un par de meses en todo esto del
> sofware libre y opensource, hace unos dias empeze a aprender GTK+ para
> tratar de contribuir, ya hago ventanas, botones, box, y todo lo
> basico. my pregunta es: como puedo utilizar la misma vetana al pasar a
> otra funcion?, ya que cuando paso a otra funcion tengo que hacer otra
> ventana
> 
Hola Sebastian,

Si, justamente el truco esta por aqui,

La definicion de las se~ales es que puedas pasar un parametro arbitrario
(un gpointer) para la funcion que tengas como receptor de tu se~al.

Sin snipear, el codigo que colocaste...


> gtk_signal_connect(GTK_OBJECT(boton), "clicked",
> GTK_SIGNAL_FUNC(boton_funcion), NULL);
> 
> De antemano, gracias.
> 
> PD: les mando el codigo para que entiendan lo que quiero hacer.
> 
> #include <gtk/gtk.h>
> 
> void boton_funcion();
> 
> int main (int argc, char * argv[]){
>      
>     GtkWidget *ventana, *boton, *etiqueta2;
>     GtkWidget *vbox;
>     
>     gtk_init(&argc, &argv);
>     
>     ventana=gtk_window_new(GTK_WINDOW_TOPLEVEL);
>     gtk_window_set_default_size(GTK_WINDOW(ventana), 200, 200);
>     boton=gtk_button_new_with_label("Boton");
>     etiqueta2=gtk_label_new("Presione el boton para tener otra
> ventana");
>     vbox=gtk_vbox_new(TRUE, 0);
>     gtk_box_pack_start((GtkBox *) vbox, etiqueta2, TRUE, TRUE, 0);
>     gtk_box_pack_start((GtkBox *) vbox, boton, TRUE, TRUE, 0);
>     gtk_container_add(GTK_CONTAINER(ventana), vbox);
>     gtk_signal_connect(GTK_OBJECT(ventana), "delete_event",
> GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
>     gtk_signal_connect(GTK_OBJECT(boton), "clicked",
> GTK_SIGNAL_FUNC(boton_funcion), NULL);
>     gtk_window_set_title(GTK_WINDOW(ventana), "Ventana");
>     gtk_widget_show_all(ventana);
>        gtk_main();
>     return 0; 
> }
> void boton_funcion(){
>     GtkWidget *etiketa, *boton, *ventana2;
>     
>     ventana2=gtk_window_new(GTK_WINDOW_TOPLEVEL);
>     etiketa=gtk_label_new("       Otra ventana mas        ");
>     gtk_container_add(GTK_CONTAINER(ventana2), etiketa);
>     gtk_window_set_title(GTK_WINDOW(ventana2), "boton_funcion");
>     gtk_widget_show_all(ventana2);
> }

...tiene un problema.

En este caso, cuando llamas a la funcion boton_funcion, lo que le pasas
realmente es un gpointer.

Y puedes encapsular casi cualquier cosa ahi. Incluso, un widget. 

La definicion de una funcion de recepcion de se~al cuando existe la
se~al button.clicked es

static void
funcion (GtkWidget *widget, gpointer data)

dice que widget es el widget que llama la funcion, y data es el puntero
a otro tipo de datos. Y puedes pasar incluso un control GtKWidget por
ahi.

Por ejemplo, en esta linea

gtk_signal_connect(GTK_OBJECT(boton), "clicked",
GTK_SIGNAL_FUNC(boton_funcion), NULL);

Puedes perfectamente cambiarla a

gtk_signal_connect(GTK_OBJECT(boton), "clicked",
GTK_SIGNAL_FUNC(boton_funcion), (gpointer) ventana );

De ahi cuando declares tu funcion:

static void
boton_click (GtkWidget * widget, 
		gpointer data)

Usas algo como 

GtkWidget * ventanawd = (GtkWidget *) data;

Y como existe un arbol de herencias en GTK+ para determinar un widget en
particular (por algo puedes pasarlo a una se~al) podrias buscarlo, pero
es algo mas lento.

Creo que German podria aclarar mas la melcocha que acago de decir. 

Saludos!

--j



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]