在 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”)时,我收到了与您注意到的相同的警告和严重错误消息。

此致。