Re: [DUDA] GTK+
- From: Juan Carlos Inostroza <jci codemonkey cl>
- To: gnome-cl-list gnome org
- Subject: Re: [DUDA] GTK+
- Date: Tue, 12 Feb 2008 23:41:59 -0300
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]