Motivation
Im vorigen Teil „LXDE für Anwendungsentwickler (1)“ haben wir eine einfache Anwendung erstellt, die in C geschrieben ist und ein einfaches Fenster, ohne Inhalt, zeichnet. In diesem Teil soll dem Fenster Leben eingehaucht werden. Dazu wird eine Textbox erstellt und zwei Buttons (OK und Ende). Bei jedem Klicken des OK Buttons, wird in der Konsole der Inhalt des Textfeldes ausgegeben. Beim Drücken auf den Ende Button, wird die Anwendung beendet.
Glade – GUI „aufmotzen“
Mal sehen, ob ich das trotzdem hinkriege…
Jetzt geht es also darum, dem Fenster „Leben“ einzuhauchen bzw. es nach unseren Wünschen zu gestalten ;-). Dazu verwenden wir „
Glade“ – einen sog. Graphical Interface Designer. Ein Tool also, mit dem wir die Oberfläche unseres Fensters designen können. Den muss man nicht separat starten, ein Doppelklick auf die Datei „helloworld.ui“ übernimmt das für uns:
Das Ergebnis:
Drückt man auf den Knopf „Palette“, werden die verfügbaren Steuererlemente auf der linken Seite angezeigt, in der Mitte wird das Fenster
dargestellt und später auch designed und rechts sieht man die Properties bzw. Eigenschaften des Elementes, welches im mittleren Fenster selektiert wird:
Übrigens, das sog. Toplevel-Window ist in der Palette unter „Toplevels“ unter „Window“ zu finden. Zunächst wählen wir unter Container die sog. „Box“ aus und fügen Sie in das mittlere Fenster ein.
Bei den Einstellungen ist zunächst nur wichtig, dass die Anzahl der Zeilen auf „2“ und die Ausrichtung auf „Vertical“ steht:
Das Fenster sollte nun so aussehen:
Wir wiederholen das und klicken die untere Zeile an, jetzt wählen wir als Anzahl „2“, aber als Ausrichtung „Horizontal“:
Jetzt fügen in der unteren Zeile in jeder Spalte einen Button hinzu (zu finden unter „Control and Display“):
Button links:
Name: btnOK
Beschriftung: OK
Button rechts:
Name: btnEXIT
Beschriftung: Ende
Wählen Sie die untere Zeile komplett aus (bei mir „box2“) und setzen Sie in den Properties „Gemeinsam“ die „Horizontale Ausrichtung“ auf „End“:
Das Ergebnis müsste dann so aussehen:
In der oberen Zeile fügen wir wieder eine „Box“ ein, mit der Spaltenanzahl „2“ und der Ausrichtung „Horizontal“. Rechts fügen wir ein Label ein und links einen „Text Entry“.
Label:
Name: lblName
Beschriftung: Name:
Textfeld:
Name: txtName
Für das Textfeld setzen wir in den Properties unter „Gemeinsam“ die Einstellung „Horizontale Ausrichtung“ auf „Fill“ und „Rechter Rand“ auf „7“. Das Hauptfenster verkleinern wir auf die gewünschte Größe.
Anschließend kompilieren und starten, das Ergebnis müsste dann so aussehen:
Signale – GUI „zum Leben erwecken“
Jetzt haben wir ein Eingabefeld und zwei Buttons, damit die auch einen Sinn ergeben, benötigen wir die Verwendung von „Signalen“ und sog. „Callbacks“. Jedes GUI-Element stellt von sich aus, eine Reihe von Signalen zur Verfügung. Da ein Button eine GTK-Klasse ist („GtkButton“), die von einer anderen abgeleitet ist, erbt sie auch alle Signale von der Vater-Klasse usw.:
Uns interessiert das Signal „clicked“, das jedesmal ausgelöst wird, wenn man auf den Button klickt. In der Spalte „Steuerung“ defineiren wir die sog. Callback-Funktion, die jedesmal aufgerufen wird, wenn das Signal ausgelöst wird, mit anderen Worten, wenn der Knopf angeklickt wird. Die Spalte „Benutzerdaten“ ermöglicht die Übergabe individueller Daten an die Callback-Funktion, z.B. ein anderes GUI-Element (Widget). Dazu gibt man hier einfach den Namen des betreffenden GUI-Elementes an, welches man übergeben will.
In unserem Fall wollen wir jedesmal, wenn der OK-Button gedrückt wird, den Inhalt des Textfeldes übergeben. Wir definieren deshalb die Callback-Funktion in der Spalte „Steuerung“: „on_key_OK_clicked“ (Name ist beliebig) und in der Spalte „Benutzerdaten“: „txtName“, also den Namen des Textfeldes (s.o.).:
Jetzt definieren wir in der Datei „helloworld.h“ die Signatur der Callback-Funktion (vor dem Makro „G_END_DECLS“):
/* Callbacks */
void on_key_OK_clicked (GtkButton *button, GtkEntry *text);
und in „helloworld.c“ die Definition:
void on_key_OK_clicked (GtkButton *button, GtkEntry *text) {
printf("OK button clickedn");
gchar *text1;
text1 = gtk_entry_get_text (text);
printf("%sn", text1);
}
Wenn wir jetzt kompilieren, linken und ausführen, erscheint jedesmal der Inhalt des Textfeldes in der Konsolenausgabe.
Gefällt mir Wird geladen …