Abrufen der tatsächlich angezeigten Höhe und Breite eines Gtk-Widgets

Lesezeit: 3 Minuten

Benutzeravatar von User7723337
Benutzer7723337

Um die Höhe und Breite von a zu erhalten GtkEventBoxich habe folgendes versucht:

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

Welche Funktion gibt Ihnen die tatsächlich angezeigte Höhe und Breite des Widgets?

Benutzeravatar von joveha
joveha

Sobald Ihr Widget realisiert wurde (mit einer Größe, die davon abhängt, was der übergeordnete Container ihm geben kann), sollten Sie in der Lage sein, diese Werte zu erhalten widget->allocation.width Und widget->allocation.height.

Es ist nichts Falsches daran, wie gtk dies tut. Es gibt einen Unterschied zwischen der Größe, die ein Widget haben möchte, und der Größe, die es tatsächlich bekommt. Daher ist das Timing beim Lesen dieser Werte wichtig. Das Vorhandensein von ‘get’-Methoden für diese Variablen ändert nichts an der Tatsache, dass sie noch nicht initialisiert sind.

Die übliche Art und Weise, wie die Leute dies umgehen, besteht darin, das anzuzapfen size-allocate Signal, das ausgegeben wird, wenn das Widget eine neue aktuelle Größe hat. Etwas wie das:

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

Und verbinden Sie irgendwo in Ihrer Hauptschleife das Signal:

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

  • Gehe ich richtig davon aus, dass die Zuordnung nicht abrufbar ist, es sei denn, das Steuerelement wurde mit sichtbar gemacht show_all? (Ich muss eine verwenden Fixed Layout und möchten die Breite von Widget 1 wissen, bevor Sie Widget 2 hinzufügen)

    – phil294

    7. August 2022 um 13:39 Uhr

Wenn Sie GTK3 verwenden und das Widget realisiert wurde, können Sie nach der Zuordnung fragen. Dies hat den Vorteil, dass es der Raum ist, den es gibt Wirklich hat im Gegensatz zu dem, was es verlangt 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);

  • Es hat keinen Sinn, Daten hier dynamisch zuzuweisen, deklarieren Sie einfach Ihre Alloc-Variable auf dem Stack, nicht auf dem Heap.

    – Befreiungskraft

    8. November 2012 um 13:47 Uhr

  • etwas wie das ? : GtkAllocation alloc; gtk_widget_get_allocation(widget, &alloc); printf("widget size is currently %dx%d\n",alloc.width, alloc.height);

    – revo

    27. August 2013 um 7:09 Uhr


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

  • getting a size request requires the widget to be associated with a screen Ich möchte die Größe des Widgets erhalten, bevor es auf dem Bildschirm angezeigt wird.

    – Benutzer7723337

    20. April 2010 um 14:01 Uhr

  • Es muss nicht angezeigt werden, sondern nur mit dem Bildschirm verknüpft werden – um zu wissen, welche Schriftarten verwendet werden sollen usw.

    – el.pescado – нет войне

    20. April 2010 um 14:37 Uhr

  • Danke, es hat funktioniert gtk_widget_size_request() Vielen Dank.

    – Benutzer7723337

    21. April 2010 um 6:28 Uhr

  • gtk_widget_size_request() gibt die Größe zurück, die das Widget haben möchte, die sehr wohl von der Größe abweichen kann, die es bekommen hat. Siehe meine Antwort

    – joveha

    21. April 2010 um 16:58 Uhr


Sind Sie sicher, dass Ihr Widget sowohl angezeigt als auch realisiert/gemappt wurde? Sie können die Größe nicht erhalten, bis das Widget “echt” angelegt wurde.

Versuchen Sie, die zu hören Kartenereignis Signal.

1444180cookie-checkAbrufen der tatsächlich angezeigten Höhe und Breite eines Gtk-Widgets

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy