C语言 获取Gtk小部件的实际显示高度和宽度

7ajki6be  于 2023-02-21  发布在  其他
关注(0)|答案(4)|浏览(208)

为了获得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); //getting 0

什么函数会给予你小部件实际显示的高度和宽度?

zbq4xfa0

zbq4xfa01#

小部件实现后(给定大小取决于其父容器可以提供的大小),应该能够通过widget->allocation.widthwidget->allocation.height获得这些值。
gtk做这件事的方式并没有错,widget想要的大小和它实际得到的大小是有区别的,所以阅读这些值的时间是很重要的,为这些变量使用“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);

db2dz4w8

db2dz4w82#

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

cx6n0qe33#

使用gtk小部件大小请求(),而不是gtk小部件获取大小请求()。
http://library.gnome.org/devel/gtk/stable/GtkWidget.html#gtk-widget-size-request

ipakzgxi

ipakzgxi4#

你确定你的小部件已经被显示和实现/Map了吗?在小部件被“真正”布局之前,你不能得到它的大小。
尝试收听Map事件信号。

相关问题