2010-04-20 9 views
17

versuchen, Höhe und Breite der GtkEventBox zu bekommen.
Versuchte folgende Dinge.Völlig satt mit Get Gtk Widget Höhe und Breite

Es ist wirklich schlecht, dass Gtk keine einfache Funktion zur Verfügung gestellt hat, die Ihnen die tatsächlich angezeigte Höhe und mit dem Widget geben wird.

Wer hat versucht, Höhe und mit GtkWidget zu bekommen?

Antwort

28

Sobald Ihr Widget (bei einer Größe je nachdem, was es übergeordneten Container kann es geben) realisiert wurden Sie sollten in der Lage sein, diese Werte mit widget->allocation.width und widget->allocation.height zu bekommen.

Es ist nichts falsch in der Art, wie GTK dies tut. Es gibt einen Unterschied zwischen der Größe eines Widgets und der tatsächlichen Größe. Daher ist das Timing beim Lesen dieser Werte wichtig. Methoden für diese Variablen zu erhalten, ändert nicht die Tatsache, dass sie noch nicht initialisiert sind.

Die übliche Art und Weise Menschen um diese zu gehen, ist in die size-allocate Signal tippen, die ausgegeben wird, wenn das Widget eine neue tatsächliche Größe bekam. Etwas wie folgt aus:

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

Und in der Hauptschleife irgendwo, schließen Sie das Signal:

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

3

Sind Sie sicher, dass Ihr Widget sowohl angezeigt als auch umgesetzt wurde? Sie können die Größe erst erhalten, wenn das Widget "real" angelegt wurde.

Versuchen Sie, das Signal map-event zu hören.

+1

Ich mache 'gtk_widget_show' vor dem Aufruf dieser Funktion. aber ich ding zu der Zeit ist es nicht wirklich auf dem Bildschirm gezeichnet (wie dort Eltern wurde nicht gezeigt), aber ich brauche diese Parameter, bevor es auf dem Bildschirm gezeichnet, wie ich diese Werte zu einem anderen Prozess übergeben muss. wie bekomme ich es? – User7723337

+0

@PP: Ich glaube nicht, dass Sie wissen können, bevor das eigentliche Layout passiert. Vielleicht können Sie Ihr Design ändern, damit der andere Prozess die Koordinaten erhalten kann, sobald sie bekannt sind? – unwind

4

Verwenden Sie gtk_widget_size_request(), nicht gtk_widget_get_size_request().

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

+0

'Um eine Größenanfrage zu erhalten, muss das Widget mit einem Bildschirm verknüpft sein. 'Ich möchte die Größe des Widgets abrufen, bevor es auf dem Bildschirm angezeigt wird. – User7723337

+0

Es muss nicht angezeigt werden, nur mit Bildschirm verbunden - zu wissen, welche Schriftarten usw. verwenden. –

+0

Danke, es funktioniert 'gtk_widget_size_request()' Vielen Dank. – User7723337

5

Wenn Sie GTK3 verwenden und das Widget realisiert wurde, können Sie fragen, was sie hat zugewiesen worden. Dies hat den Vorteil, dass es der Raum ist, den es wirklich hat im Gegensatz zu dem, was es angefordert hat.

//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

Es hat keinen Sinn, Daten hier dynamisch zuzuweisen. Erklären Sie einfach Ihre Alloc-Variable auf dem Stack, nicht auf dem Heap. – liberforce

+2

so etwas wie das?: 'GtkAllocation alloc; gtk_widget_get_allocation (Widget & Alloc); printf ("Widgetgröße ist derzeit% dx% d \ n", alloc.width, alloc.height); ' – revo