Подтвердить что ты не робот

Полностью измученный с ростом высоты и ширины виджета Gtk

Попытка получить высоту и ширину 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?

4b9b3361

Ответ 1

Как только ваш виджет будет реализован (учитывая размер в зависимости от того, что он может предоставить родительскому контейнеру), вы сможете получить эти значения с помощью 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);

Ответ 2

Если вы используете 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

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

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