在 GTK2/C 中加载并使用 Glade 布局
Load and use a Glade layout in GTK2/C
我试图将 Glade 布局加载到 GTK2 C 代码中。
它由一个 window 组成,其中有一个包含 2 个元素的 VBox:一个标签和一个按钮。我想将信号关联到按钮以关闭应用程序。
如果我只使用 C 代码完成所有这些工作,它工作正常,但是当我加载布局时,我收到以下运行时错误(应用程序启动但按钮不起作用):
(main:2581): GLib-GObject-WARNING **: 21:38:46.789: invalid (NULL) pointer instance
(main:2581): GLib-GObject-CRITICAL **: 21:38:46.790: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
这里我使用的代码,mylayout.glade是我项目文件夹中的一个文件:
#include <gtk/gtk.h>
void
end_program (GtkWidget * wid, gpointer ptr)
{
gtk_main_quit();
return;
}
int
main (int argc, char * argv[])
{
GError * error = NULL;
gtk_init(&argc, &argv);
GtkBuilder * builder = gtk_builder_new();
if (0 == gtk_builder_add_from_file(builder, "mylayout.glade",
&error))
{
g_printerr("Error loading file: %s\n", error->message);
g_clear_error(&error);
return 1;
}
GtkWidget * win = (GtkWidget *) gtk_builder_get_object(builder,
"window1");
GtkWidget * btn = (GtkWidget *) gtk_builder_get_object(builder,
"button1");
g_signal_connect(btn, "clicked", G_CALLBACK(end_program), NULL);
gtk_widget_show_all(win);
gtk_main();
return 0;
}
我唯一注意到的是,如果我删除 g_signal_connect() 行,错误就会消失。
非常感谢任何帮助。
您可能需要检查您在 glade 文件中为按钮小部件指定的名称。我可以复制您的错误的唯一方法是当 glade 文件中定义的按钮小部件的名称与程序语句中引用的“button1”不同时:
GtkWidget * btn = (GtkWidget *) gtk_builder_get_object(builder, "button1");
当 glade 文件对按钮使用不同的名称(例如“按钮”或“btn”)时,我收到了与您注意到的相同的警告和严重错误消息。
此致。
我试图将 Glade 布局加载到 GTK2 C 代码中。
它由一个 window 组成,其中有一个包含 2 个元素的 VBox:一个标签和一个按钮。我想将信号关联到按钮以关闭应用程序。
如果我只使用 C 代码完成所有这些工作,它工作正常,但是当我加载布局时,我收到以下运行时错误(应用程序启动但按钮不起作用):
(main:2581): GLib-GObject-WARNING **: 21:38:46.789: invalid (NULL) pointer instance
(main:2581): GLib-GObject-CRITICAL **: 21:38:46.790: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
这里我使用的代码,mylayout.glade是我项目文件夹中的一个文件:
#include <gtk/gtk.h>
void
end_program (GtkWidget * wid, gpointer ptr)
{
gtk_main_quit();
return;
}
int
main (int argc, char * argv[])
{
GError * error = NULL;
gtk_init(&argc, &argv);
GtkBuilder * builder = gtk_builder_new();
if (0 == gtk_builder_add_from_file(builder, "mylayout.glade",
&error))
{
g_printerr("Error loading file: %s\n", error->message);
g_clear_error(&error);
return 1;
}
GtkWidget * win = (GtkWidget *) gtk_builder_get_object(builder,
"window1");
GtkWidget * btn = (GtkWidget *) gtk_builder_get_object(builder,
"button1");
g_signal_connect(btn, "clicked", G_CALLBACK(end_program), NULL);
gtk_widget_show_all(win);
gtk_main();
return 0;
}
我唯一注意到的是,如果我删除 g_signal_connect() 行,错误就会消失。
非常感谢任何帮助。
您可能需要检查您在 glade 文件中为按钮小部件指定的名称。我可以复制您的错误的唯一方法是当 glade 文件中定义的按钮小部件的名称与程序语句中引用的“button1”不同时:
GtkWidget * btn = (GtkWidget *) gtk_builder_get_object(builder, "button1");
当 glade 文件对按钮使用不同的名称(例如“按钮”或“btn”)时,我收到了与您注意到的相同的警告和严重错误消息。
此致。