Usuario7723337
Para obtener la altura y el ancho de un GtkEventBox
probé lo siguiente:
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); //getting 0
¿Qué función le dará la altura y el ancho reales que se muestran del widget?
joveha
Una vez que su widget se haya realizado (dado un tamaño dependiendo de lo que su contenedor principal pueda darle), debería poder obtener estos valores con widget->allocation.width
y widget->allocation.height
.
No hay nada malo en la forma en que gtk hace esto. Hay una diferencia entre el tamaño que le gustaría tener a un widget y el tamaño que realmente tiene. Por lo tanto, el tiempo de lectura de estos valores es importante. Tener métodos ‘get’ para estas variables no cambiará el hecho de que aún no están inicializadas.
La forma habitual en que la gente soluciona esto es aprovechar el size-allocate
señal 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);
-
¿Tengo razón al suponer que la asignación no se podrá recuperar a menos que el control se haya hecho visible con
show_all
? (Tengo que usar unFixed
diseño y quiero saber el ancho del widget 1 antes de agregar el widget 2)– phil294
7 de agosto de 2022 a las 13:39
Si está utilizando GTK3 y el widget se ha realizado, puede preguntar qué se ha asignado. Esto tiene la ventaja de ser el espacio que en realidad tiene en contraposición a 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);
-
No tiene sentido asignar datos dinámicamente aquí, simplemente declare su variable de asignación en la pila, no en el montón.
– liberforce
8 de noviembre de 2012 a las 13:47
-
algo como esto ? :
GtkAllocation alloc; gtk_widget_get_allocation(widget, &alloc); printf("widget size is currently %dx%d\n",alloc.width, alloc.height);
– revo
27 de agosto de 2013 a las 7:09
Utilice gtk_widget_size_request(), no gtk_widget_get_size_request().
http://library.gnome.org/devel/gtk/stable/GtkWidget.html#gtk-widget-size-request
-
getting a size request requires the widget to be associated with a screen
Quiero obtener el tamaño del widget antes de que se muestre en la pantalla.– Usuario7723337
20 de abril de 2010 a las 14:01
-
No tiene que mostrarse, solo asociarse con la pantalla, para saber qué fuentes usar, etc.
– el.pescado – нет войне
20 de abril de 2010 a las 14:37
-
Gracias, funcionó
gtk_widget_size_request()
Muchas gracias.– Usuario7723337
21 de abril de 2010 a las 6:28
-
gtk_widget_size_request()
devuelve el tamaño que le gustaría tener al widget, que muy bien podría diferir del tamaño que obtuvo. ver mi respuesta– joveha
21 de abril de 2010 a las 16:58
¿Está seguro de que su widget se ha mostrado y realizado/mapeado? No puede obtener el tamaño hasta que el widget se haya diseñado “de verdad”.
Intenta escuchar el mapa-evento señal.