【问题标题】:What's the GTK header I need to include so I can use lookup_widget?我需要包含什么 GTK 标头才能使用 lookup_widget?
【发布时间】:2012-05-04 16:16:39
【问题描述】:

如下例所示,这个回调函数是当用户点击确定按钮时。我可以使用 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 找到十亿个sn-ps 代码示例,但没有一个完整的源代码示例显示支持使用它的标头。我正在使用 Anjuta3.2.0 和最新的 Glade 插件。

【问题讨论】:

  • lookup_widget 不能是 GTK 的公共函数。他们都有gtk作为前缀。
  • 好的,所以我的问题是错误的。 lookup_widget 是一个 Glade 实用函数。有谁知道要包含的正确标题,以便我可以使用此 Glade 实用程序功能?
  • lookup_widget 似乎是 Glade 生成 的函数;您是否在生成的文件中搜索过它? fifi.org/doc/glade-common/help/glade/C/faq/index.html
  • 如链接部分 1.4.5 所示,使用 glade API。 @BasileStarynkevitch:也许您应该使用链接中提到的建议替代方法将其发布为答案。

标签: c gtk header-files


【解决方案1】:

正如 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);

然后对每个顶级窗口执行以下操作:

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

在我看来,麻烦大于它的价值。

【讨论】:

    【解决方案2】:

    Glade-2 在support.c 中实现lookup_widget(),并且标头为support.h 一旦将 GLADE GUI 转换为 C 代码,这些文件就会自动生成。

    【讨论】:

      猜你喜欢
      • 2020-09-09
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      相关资源
      最近更新 更多