2016-05-04 15 views
0

Was ist die richtige Syntax bei der Verwendung von GTK + 3 (und Glade) zum Erstellen eines einfachen Fensters aus einer XML-Datei Licht? Ich habe zwei Methoden gesehen, die das Gleiche zu tun scheinen, aber die Syntax ist etwas anders.Verwenden von "GtkWidget * window" vs "GObject * window" in C

Beispiel 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; 
} 

Beispiel 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; 
} 

Antwort

4

Beide sollten funktionieren, aber ich denke, es ist vernünftiger GtkWidget zu verwenden, wie Sie diese Art viel mehr benötigen, können Sie so muss nicht die ganze Zeit GTK_WIDGET(obj) schreiben. Sie müssen es nur einmal "umwandeln".

Bitte beachten Sie, dass das offizielle Handbuch GObject Typ verwendet. (here)

Aber schließlich können Sie entscheiden, wie Sie leicht können ‚umwandeln‘ es auf die Art Sie brauchen ...

+0

Meinten Sie es besser ist, GObject zu verwenden, anstatt GtkWidget (weil, wenn Sie eine verwenden Sie müssen zurück zum Objekttyp konvertieren, zumindest auf der Grundlage des obigen Codes. Wenn Sie zu der Zeile gehen, die mit folgendem beginnt: window = – Snorklebort

+0

Ich persönlich denke, dass GtkWidget eine bessere Wahl ist, da Sie wahrscheinlich einen Widget-Typ verwenden werden gtk Anwendungen und kein Objekttyp ... Stell dir das erste Beispiel mit einem gtk_widget_show() oder einem gym_widget_destroy() vor, als du ein Widget brauchst – mame98

+0

Ok ich sehe :) danke – Snorklebort