如下例所示,此回调函数是用户单击“确定”按钮时的功能。我可以使用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找到十亿个代码片段的例子,但是没有一个完整的源代码示例显示了能够使用它的头文件。我正在使用Anjuta3.2.0和最新的Glade插件。
答案 0 :(得分: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);
然后对每个顶层窗口执行以下操作:
g_object_set_data (G_OBJECT (toplevel), "name-of-toplevel", toplevel);
对我而言似乎比它值得更麻烦。
答案 1 :(得分:0)
Glade-2在lookup_widget()
中实施support.c
,标题为support.h
将GLADE GUI转换为C代码后,这些文件将自动生成。