完全厌倦了获得Gtk小部件的高度和宽度

时间:2010-04-20 13:40:08

标签: c 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 个答案:

答案 0 :(得分:33)

一旦你的小部件被实现(给定大小取决于它的父容器可以给它的大小),你应该能够通过widget->allocation.widthwidget->allocation.height获得这些值。

gtk这样做的方式没有错。小部件想要具有的大小与实际大小之间存在差异。因此,阅读这些值的时机非常重要。对这些变量“获取”方法不会改变它们尚未初始化的事实。

人们通常采用的方法是点击小部件获得新实际大小时发出的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);

答案 1 :(得分:5)

如果您正在使用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);

答案 2 :(得分:4)

使用gtk_widget_size_request(),而不是gtk_widget_get_size_request()。

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

答案 3 :(得分:3)

您确定您的小部件已经显示并实现/映射吗?在小部件布局为“真实”之前,您无法获得大小。

尝试收听map-event信号。

相关问题