1

以下の例に示すように、このコールバック関数は、ユーザーが [OK] ボタンをクリックしたときのものです。gtk_widget_get_toplevel を使用してボタンからウィンドウ (最上位のウィジェット) を取得できますが、ENTRY という名前の GtkEntry ウィジェットのウィジェット ポインターを取得しようとして行き詰まりました。

/* Called when OK button is clicked */
on_BT_OK_clicked(GtkButton *button, gpointer user_data)
{
    //The line directly below is the one I get an error on
    GtkWidget *entry = lookup_widget( GTK_WIDGET(button), "ENTRY" );

    gchar *text1, *text2;
    text1 = gtk_entry_get_text( GTK_ENTRY(entry));
    text2 = g_strconcat("Hello, ", text1, NULL);
    GtkWidget *window = gtk_widget_get_toplevel (GTK_WIDGET(button));
    GtkWidget *dialog = gtk_message_dialog_new( window,
                                               GTK_DIALOG_DESTROY_WITH_PARENT,
                                               GTK_MESSAGE_INFO,
                                               GTK_BUTTONS_CLOSE,
                                               text2);
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}

しかし、「lookup_widget への未定義の参照」というエラーが表示されます。lookup_widget を使用したコードのスニペットのサンプルは 10 億個も見つかりますが、それを使用できるようにするヘッダーを示す完全なソース コードのサンプルは 1 つもありません。Anjuta3.2.0 と最新の Glade プラグインを使用しています。

4

2 に答える 2

3

Basile Starynkevitch が言うように、lookup_widget()は Glade 2 によって生成された関数でした。しかし、Glade によるコード生成は、(最初の) libglade と (後の) GtkBuilder を支持して、かなり長い間廃止されてきました。実際、Glade 3 ではそれさえできません。

推奨される解決策は、シグナルを接続するときに ENTRY へのポインターをユーザー データ ポインターとして渡すことです。または、 を使用している場合はgtk_builder_connect_signals()、ENTRY へのポインターをクラスに格納し、そのクラスをユーザー データ ポインターとして渡します。

ただし、使用する必要がlookup_widget()ある場合は、Glade 2 が約 6 年前に生成したソースを次に示します。

GtkWidget*
lookup_widget (GtkWidget *widget,
               const gchar *widget_name)
{
  GtkWidget *parent, *found_widget;

  for (;;)
    {
      if (GTK_IS_MENU (widget))
        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
      else
        parent = widget->parent;
      if (!parent)
        parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey");
      if (parent == NULL)
        break;
      widget = parent;
    }

  found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget),
                                                 widget_name);
  if (!found_widget)
    g_warning ("Widget not found: %s", widget_name);
  return found_widget;
}

これを機能させるには、トップレベル ウィンドウに含まれるすべてのウィジェットに対して次の操作を行う必要があります。

g_object_set_data_full (G_OBJECT (toplevel), "name-of-widget", gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref);

次に、トップレベル ウィンドウごとに次の操作を 1 回実行します。

g_object_set_data (G_OBJECT (toplevel), "name-of-toplevel", toplevel);

私には、価値がある以上に面倒なことのように思えます。

于 2012-05-04T19:43:44.273 に答える
0

Glade-2 の実装lookup_widget()support.cヘッダーはsupport.h GLADE GUI が C コードに変換されると、これらのファイルは自動的に生成されます。

于 2014-12-17T05:32:11.813 に答える