Seitenleiste

Einfache GTK-Widgets

Im letzten Kapitel haben wir uns mit der Anordnung von Widgets (Elementen) beschäftigt. Doch, das was wir angeordnet haben wir wenig spektakulär, es war nur einfacher Text, sogenannte Labels. Nun möchten wir uns dieses Widget einmal genauer anschauen und auch ein neues kennen lernen.

Labels

Das GtkLabel gehört zu den einfachsten GTK-Widgets, die es überhaupt gibt. Doch lohnt es sich, es sich einmal genauer anzuschauen.

#include <gtk/gtk.h>
 
int main(int argc, char** argv)
{
    GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *label;
 
    gtk_init(&argc, &argv);
 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 
    vbox = gtk_vbox_new(FALSE, 10);
    gtk_container_add(GTK_CONTAINER(window), vbox);
 
    label = gtk_label_new("Dies ist ein ganz einfaches GTK-Programm mit einem Label");
    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
 
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
 
    gtk_widget_show_all(window);
 
    gtk_main();
    return 0;
}

Im letzten Kapitel haben wir keine eigene Variable für unser Label erstellt, da wir es nur in der gtk_box_pack_start Funktion erstellt haben. Der Nachteil ist, dass wir das GtkLabel danach nicht bearbeiten können. In diesem Beispiel haben wir mit

GtkWidget *label

ein neues GtkWidget erstellt mit dem Bezeichner label.

Mit

label = gtk_label_new("Dies ist ein ganz einfaches GTK-Programm mit einem Label");

füllen wir die bis jetzt leere Variable label. gtk_label_new erwartet als Argument den Text, den das GtkLabel haben soll.

Mit der schon bekannten Funktion

gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);

packen wir das Widget wieder in die GtkVBox.

Buttons

Nun kann der Nutzer ein Label nur lesen. Möchten wir allerdings, dass der Benutzer unseres Programms auch selbst zur Tat schreiten kann, sind andere Widgets nötig. Ein GtkButton ist so Widget. In GTK können Buttons einfachen Text enthalten oder sogar kleine Icons. Mit dem folgenden Code wird unser Beispiel von oben um einen Button erweitert. Wenn ihr darauf klickt, so sollte sich das Fenster beenden!

#include <gtk/gtk.h>
 
int main(int argc, char** argv)
{
    GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *label;
    GtkWidget *button;
 
    gtk_init(&argc, &argv);
 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 
    vbox = gtk_vbox_new(FALSE, 10);
    gtk_container_add(GTK_CONTAINER(window), vbox);
 
    label = gtk_label_new("Dies ist ein ganz einfaches GTK-Programm mit einem Label");
    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
 
    button = gtk_button_new_with_label("Programm beenden.");
    gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
 
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(button, "clicked", G_CALLBACK(gtk_main_quit), NULL);
 
    gtk_widget_show_all(window);
 
    gtk_main();
    return 0;
}

Wie gewünscht, erscheint ein „Knopf“ unter dem Label:
1)
Nach Klick auf diesen sollte sich das Fenster (und damit auch das Programm) von selbst schließen. Für den Button selber haben wir, wie für das Label auch, einen Zeiger auf ein GtkWidget reserviert. Mit

button = gtk_button_new_with_label("Programm beenden.");

erstellen wir dann einen Button mit einem Label, also ganz einfachen Text. Damit das Widget auch im Fenster zu sehen ist, platzieren wir es wie beim Label in die Box. Für das Schließen des Fensters ist folgende Funktion zuständig:

g_signal_connect(button, "clicked", G_CALLBACK(gtk_main_quit), NULL);

Mit dieser Zeile legen wir fest, dass beim Klicken auf den Button (dem Event), das Fenster geschlossen werden soll (gtk_main_quit). Genaueres zu solchen Signalen werdet ihr im nächsten Kapitel erfahren!

Ausblick

Unser schönes GTK Fenster hat nun endlich einen Inhalt bekommen. Doch zu einer vollständigen GUI fehlt noch ziemlich viel. Im nächsten Kapitel beschäftigen wir uns erst einmal mit Signalen, damit beispielsweise bei einem Klick auch etwas passiert.

zurück || hoch zur Startseite || weiter

1)
Hinweis: der Fenstertitel und das Fensterdesign können varieren