Полностью сыт по горло с Get Gtk виджет высоты и ширины - PullRequest
21 голосов
/ 20 апреля 2010

Попытка получить высоту и ширину GtkEventBox.
Пробовал следующие вещи.

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

Очень плохо, что Gtk не предоставил простую функцию, которая даст вам фактическую отображаемую высоту и виджет.

Кто-нибудь пытался получить высоту и с помощью GtkWidget?

Ответы [ 4 ]

33 голосов
/ 20 апреля 2010

Как только ваш виджет будет реализован (учитывая размер в зависимости от того, что может предоставить его родительский контейнер), вы сможете получить эти значения с widget->allocation.width и widget->allocation.height.

Нет ничего плохого в том, как это делает gtk. Есть разница между тем, какой размер хочет видеть виджет, и каким размером он на самом деле становится. Поэтому время чтения этих значений важно. Наличие методов get для этих переменных не изменит того факта, что они еще не инициализированы.

Обычный способ обойти это - подключиться к сигналу size-allocate, который излучается, когда виджет получает новый фактический размер. Примерно так:

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

И где-нибудь в вашем основном цикле подключите сигнал:

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

5 голосов
/ 12 сентября 2012

Если вы используете GTK3, и виджет реализован, вы можете спросить, для чего он был выделен. Преимущество этого в том, что он действительно имеет пространство по сравнению с тем, что он запрашивал.

    //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);
4 голосов
/ 20 апреля 2010

Используйте gtk_widget_size_request (), а не gtk_widget_get_size_request ().

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

3 голосов
/ 20 апреля 2010

Вы уверены, что ваш виджет был показан и реализован / отображен?Вы не сможете получить размер, пока виджет не будет выложен «по-настоящему».

Попробуйте прослушать сигнал map-event .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...