2010-04-20 11 views
17

Intentando obtener la altura y el ancho de GtkEventBox.
Tried following Things.Totalmente harto de obtener la altura y el ancho del widget Gtk

GtkRequisition requisition; 
gtk_widget_get_child_requisition(widget, &requisition); 
// Getting requisition.height 0 
---------------------------------------------------------- 

widget->allocation-x //getting 0 
widget->allocation-height //getting -1 
---------------------------------------------------------- 

gtk_widget_get_size_request(widget, &height, &width); // Again getting 0 
-------------------------------------------------------------------------- 

Es muy malo que GTK no ha proporcionado función simple que le dará la altura visualizada y con la del widget.

¿Alguien trató de obtener altura y con GtkWidget?

Respuesta

28

Una vez que el widget se han realizado (dado un tamaño dependiendo de lo que se trata contenedor padre puede darle) debe ser capaz de obtener estos valores con widget->allocation.width y widget->allocation.height.

No hay nada de malo en la forma en que gtk hace esto. Existe una diferencia entre el tamaño que le gustaría tener un widget y el tamaño que realmente tiene. Entonces, el momento de leer estos valores es importante. Tener métodos 'get' para estas variables no cambiará el hecho de que aún no se hayan inicializado.

La forma habitual la gente va alrededor de esto es aprovechar la señal size-allocate que se emite cuando el widget tiene un nuevo tamaño real. Algo como esto:

void my_getsize(GtkWidget *widget, GtkAllocation *allocation, void *data) { 
    printf("width = %d, height = %d\n", allocation->width, allocation->height); 
} 

Y en su bucle principal en algún lugar, conecte la señal:

g_signal_connect(mywidget, "size-allocate", G_CALLBACK(my_getsize), NULL);

3

¿Está seguro de que su artilugio se ha mostrado y realizado/mapeado? No puede obtener el tamaño hasta que el widget se haya configurado "de verdad".

Intente escuchar la señal map-event.

+1

Estoy haciendo 'gtk_widget_show' antes de llamar a esta función. pero creo que en ese momento no se dibujó realmente en la pantalla (ya que no se ha mostrado el elemento principal), pero necesito estos parámetros antes de que se dibujen en la pantalla, ya que necesito pasar estos valores a algún otro proceso. Entonces, ¿cómo lo consigo? – User7723337

+0

@PP: No creo que pueda saber, antes de que ocurra el diseño real. ¿Quizás puede cambiar su diseño para que el otro proceso pueda recibir las coordenadas una vez que se conocen? – unwind

4

Use gtk_widget_size_request(), no gtk_widget_get_size_request().

http://library.gnome.org/devel/gtk/stable/GtkWidget.html#gtk-widget-size-request

+0

'obtener una solicitud de tamaño requiere que el widget esté asociado a una pantalla' Quiero obtener el tamaño del widget antes de que se muestre en la pantalla. – User7723337

+0

No tiene que mostrarse, solo se asocia con la pantalla, para saber qué fuentes usar, etc. –

+0

Gracias, funcionó 'gtk_widget_size_request()' Muchas gracias. – User7723337

5

Si está utilizando GTK3, y el widget se ha dado cuenta de que se puede pedir lo que tiene sido asignado. Esto tiene la ventaja de ser el espacio que realmente tiene en comparación con lo que solicitó.

//GtkWidget* widget; 
    GtkAllocation* alloc = g_new(GtkAllocation, 1); 
    gtk_widget_get_allocation(widget, alloc); 
    printf("widget size is currently %dx%d\n",alloc->width, alloc->height); 
    g_free(alloc); 
+8

No tiene sentido asignar datos dinámicamente aquí, simplemente declare su variable alloc en la pila, no en el montón. – liberforce

+2

algo como esto?: 'GtkAllocation alloc; gtk_widget_get_allocation (widget, y alloc); printf ("el tamaño del widget es actualmente% dx% d \ n", alloc.width, alloc.height); ' – revo

Cuestiones relacionadas