web-dev-qa-db-ja.com

GetGtkウィジェットの高さと幅に完全にうんざりしている

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の高さを取得しようとしましたか?

22
User7723337

ウィジェットが実現されると(親コンテナーがウィジェットに与えることができるサイズに応じて)、_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);

33
joveha

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);
5
zebediah49

Gtk_widget_get_size_request()ではなく、gtk_widget_size_request()を使用します。

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

4
el.pescado

ウィジェットが表示され、実現/マッピングされていることを確認しますか?ウィジェットが「実際に」レイアウトされるまで、サイズを取得することはできません。

map-event シグナルを聞いてみてください。

3
unwind