在 C 中使用“GtkWidget *window”与“GObject *window”

Using " GtkWidget *window " vs " GObject *window " in C

使用 GTK+ 3(和 glade)从 xml glade 文件创建简单的 window 时,正确的语法是什么?我见过两种似乎做同样事情的方法,但语法略有不同。

示例 1:

#include <gtk/gtk.h>

int
main (int argc, char *argv[])
{
  GtkBuilder *builder;
  GObject *window;

  gtk_init (&argc, &argv);

  builder = gtk_builder_new ();
  gtk_builder_add_from_file (builder, "builder.glade", NULL);

  window = gtk_builder_get_object (builder, "window");
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  gtk_main ();

  return 0;
}

示例 2:

#include <gtk/gtk.h>

void 
on_window_destroy (GtkWidget *object, gpointer user_data)
{
    gtk_main_quit ();
}

int
main (int argc, char *argv[])
{
    GtkBuilder *builder; 
    GtkWidget *window;

    gtk_init (&argc, &argv);

    builder = gtk_builder_new ();
    gtk_builder_add_from_file (builder, "builder.glade", NULL);

    window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
    gtk_builder_connect_signals (builder, NULL);

    g_object_unref (G_OBJECT (builder));

    gtk_widget_show (window);                
    gtk_main ();

    return 0;
}

两者都应该可以,但我认为使用 GtkWidget 更合理,因为您将更多地需要这种类型,所以您不需要一直写 GTK_WIDGET(obj)。您只需要 'convert' 一次。

请注意,官方指南使用GObject类型。 (here)

但毕竟你可以决定,因为你可以很容易地'convert'它到你需要的类型...