Полностью сыт по горло с Get 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?
4 ответа
Как только ваш виджет будет реализован (учитывая размер в зависимости от того, что может предоставить его родительский контейнер), вы сможете получить эти значения с 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);
Если вы используете 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);
Вы уверены, что ваш виджет был показан и реализован / отображен? Вы не можете получить размер, пока виджет не был выложен "по-настоящему".
Попробуйте прослушать сигнал карты-события.
Используйте gtk_widget_size_request(), а не gtk_widget_get_size_request ().