GTK/ Ereignisse
Aus Wikibooks
Du bist in den Beispielen bereits mit Ereignissen in Berührung bekommen. Dort haben wir immer ein Ereignis definiert, mit dem wir das Programm beendet haben, wenn der Schließen-Knopf gedrückt wird.
Genauso geht das mit anderen Elementen - und Ereignissen: eine Schaltfläche soll üblicherweise auf das Aktivieren geprüft werden, bei Textfeldern könnte ein Tastendruck zur Überprüfung der Eingabe sinnvoll sein.
Als einfaches Beispiel aber nehmen wir die Schaltfläche, die in fast jedem Programmierlehrwerk als Auslöser für Aktionen gebraucht wird:
-
#include <gtk/gtk.h>
-
-
int handlerfunktion(GtkButton *button, gpointer user_data)
-
{
-
GtkWidget *dialog;
-
-
dialog = gtk_message_dialog_new(
-
NULL,
-
GTK_DIALOG_DESTROY_WITH_PARENT,
-
GTK_MESSAGE_INFO,
-
GTK_BUTTONS_CLOSE,
-
"Huhu!",
-
NULL);
-
gtk_dialog_run(GTK_DIALOG(dialog));
-
gtk_widget_destroy(dialog);
-
}
-
-
int main(int argc, char *argv[])
-
{
-
GtkWidget *window;
-
GtkWidget *knopf;
-
-
gtk_init(&argc, &argv);
-
-
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
-
-
knopf = gtk_button_new();
-
gtk_button_set_label(GTK_BUTTON(knopf), "Klick mich!");
-
g_signal_connect(G_OBJECT(knopf), "clicked", G_CALLBACK(handlerfunktion), NULL);
-
-
gtk_container_add(GTK_CONTAINER(window), knopf);
-
-
gtk_widget_show_all(window);
-
-
gtk_main();
-
}
[Bearbeiten] Benutzerdaten für Signale
Wofür ist denn nun der letzte Parameter da? In den meisten Fällen scheint er eh NULL zu sein. Und wofür ist der Zeigerparameter da, der in unserer Signalfunktion definiert wurde? Wofür der Parameter widget steht, kann man sich ja noch denken, er enthält wohl einen Zeiger auf den angeklickten Button. Und der andere Parameter? Er kann Nutzdaten enthalten. Besser gesagt, Zeiger auf Nutzdaten. Damit könnte man beispielsweise eine einzige Routine für einen Satz von Buttons nutzen, die durchnummeriert sind und mit einer Datenstruktur verbunden sind - warum nicht einfach als Nutzdaten einen Zeiger auf diese Datenstruktur übergeben?
Angenommen, du hast ein Array mit drei Strukturen und drei Buttons in deinem Programm. Wenn du einen Button anklickst, dann soll mit der zugehörigen Datenstruktur etwas geschehen. Da sich der Typ des Widgets selbst (GtkWidget) dafür eher nicht eignet, weist man die Ereignisroutinen etwa wie folgt zu:
g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(handlerfunktion), &nutzdaten[0]); g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(handlerfunktion), &nutzdaten[1]); g_signal_connect(G_OBJECT(button3), "clicked", G_CALLBACK(handlerfunktion), &nutzdaten[2]);
In einem anderen Beispiel wollen wir jedoch etwas mit dem Zeiger auf das Steuerelement anfangen.
-
#include <gtk/gtk.h>
-
-
int handlerfunktion(GtkButton *button, gpointer user_data)
-
{
-
GtkWidget *dialog;
-
-
dialog = gtk_message_dialog_new(
-
NULL,
-
GTK_DIALOG_DESTROY_WITH_PARENT,
-
GTK_MESSAGE_INFO,
-
GTK_BUTTONS_CLOSE,
-
"Der angeklickte Button hat die Aufschrift \"%s\".",
-
gtk_button_get_label(GTK_BUTTON(button)),
-
NULL);
-
gtk_dialog_run(GTK_DIALOG(dialog));
-
gtk_widget_destroy(dialog);
-
}
-
-
int main(int argc, char *argv[])
-
{
-
GtkWidget *window, *box;
-
GtkWidget *knopf1, *knopf2, *knopf3;
-
-
gtk_init(&argc, &argv);
-
-
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
-
-
knopf1 = gtk_button_new_with_label("A");
-
knopf2 = gtk_button_new_with_label("B");
-
knopf3 = gtk_button_new_with_label("C");
-
g_signal_connect(G_OBJECT(knopf1), "clicked", G_CALLBACK(handlerfunktion), NULL);
-
g_signal_connect(G_OBJECT(knopf2), "clicked", G_CALLBACK(handlerfunktion), NULL);
-
g_signal_connect(G_OBJECT(knopf3), "clicked", G_CALLBACK(handlerfunktion), NULL);
-
-
box = gtk_hbox_new(true, 10);
-
gtk_box_pack_start_defaults(GTK_BOX(box), knopf1);
-
gtk_box_pack_start_defaults(GTK_BOX(box), knopf2);
-
gtk_box_pack_start_defaults(GTK_BOX(box), knopf3);
-
-
gtk_container_add(GTK_CONTAINER(window), box);
-
-
gtk_widget_show_all(window);
-
-
gtk_main();
-
}
[Bearbeiten] Übungsaufgaben
Die Lösungen zu den Aufgaben findest du auf der Lösungsseite.
- Erstelle eine Anwendung mit drei Schaltflächen, die die Beschriftungen "A", "B" und "C" haben. Beim Anklicken einer Schaltfläche soll die Beschriftung in "X" geändert werden.




