adventskalender.png

Fröhliche Weihnachten mit KDE

Adventskalender in C++

01.12.2003
Wieder einmal steht die Adventszeit völlig unerwartet vor der Tür. Doch zum Glück zaubern Gideon und ein wenig C++ schnell einen hübschen KDE-Adventskalender für Freunde, Verwandte und Bekannte, während man selbst ein wenig programmieren lernt.

Ob für große oder kleine Kinder – ein Adventskalender muss sein, und ein selbstgebastelter macht doppelt soviel Freude, vor allem dann, wenn man dabei ganz nebenbei in die KDE-Programmierung einsteigt. Als Bastelwerkzeug benötigen wir anstelle von Papier, Schere und Klebstoff KDevelop 3.0, die KDE-3.1.x- und Qt-3.1.x-Bibliotheken (zum Programmieren natürlich einschließlich der dev(el)-Pakete) sowie einen Compiler wie zum Beispiel den gcc 3.3.

Die KDE-Entwicklungsumgebung KDevelop wird in der neuen Version 3.0 offiziell zwar erst mit KDE 3.2 ausgeliefert, doch lässt sie sich auch jetzt schon unter dem Codenamen gideon aus dem Internet herunterladen [1] oder von der Heft-CD installieren. Bei älteren Distributionen steht allerdings erst einmal ein komplettes KDE-Update (die Dateien finden sich z. B. auf [6]) auf dem Plan.

SuSE-8.1-User müssen zusätzlich ein wenig tricksen, um gideon-3.0a4a-1_suse81.i586.rpm von der Heft-CD zu installieren: Waren alle Abhängigkeiten befriedigt, stand im Test als letztes noch eine fehlende Datei /srv/www/cgi-bin/susehelp/susesearch.cgi im Raum. Diese gab es zwar, aber unter /srv/www/cgi-bin. Setzt man einen entsprechenden Link

mkdir /srv/www/cgi-bin/susehelp
ln -s /srv/www/cgi-bin/susesearch.cgi /srv/www/cgi-bin/susehelp/susesearch.cgi

braucht man bei der Koste-es-was-es-wolle-Installation mit rpm -ivh --nodeps kein schlechtes Gewissen haben.

Aller Anfang ist leicht

Allen des Englischen Mächtigen gibt [2] eine gute Anleitung zur Arbeit mit KDevelop und Hilfsprogrammen wie dem WYSIWYG-Tool QtDesigner [3] zur Gestaltung grafischer Oberflächen mit dem Qt-Toolkit. Damit kann es schon losgehen.

Zunächst erstellen wir ein neues Projekt unter Projekt bzw. Project / New Project.... Für eine einfache KDE-Applikation wie den Adventskalender wählen wir C++ / KDE / Simple KDE Application. Unter Anwendungsname taufen wir das neue Programm adventskalender, passen die Vorgaben bei Lizenz, E-Mail und Autor an, drücken dreimal auf Nächster (Next) und dann auf Abschließen (Finish). Damit ist das Grundgerüst des neuen Programms auch schon fertig und tröstet darüber hinweg, dass KDevelop 3.0 im gegenwärtigen Entwicklungsstand noch nicht besonders viel Deutsch spricht. Auch die originalen, englischsprachigen Beschriftungen wechseln von Vorversion zu Vorversion an der einen oder anderen Stelle ihren Wortlaut.

Damit es später beim Konfigurieren und Kompilieren keine Probleme gibt, legen wir unter Projekt / Project Options... im Punkt Configure Options das Installationsoberverzeichnis (das sogenannte Präfix, siehe auch Kasten 2) und das Oberverzeichnis der zu verwendenden Qt-Installation im Punkt "configure"-Argumente ab:

--prefix=/opt/kde --with-qt-dir=/usr/local/qt

Wer KDE nicht in /opt/kde installiert hat, muss hier natürlich das richtige Installationsverzeichnis (etwa /opt/kde3) angeben. Die beiden Ordner variieren je nach Distribution und Paketersteller ein wenig: So installiert sich Qt 3.1.2 für SuSE 8.1 aus dem KDE-3.1.3-Verzeichnis von [6] nach /usr/lib/qt3.

Abbildung 1: Dateien in KDevelop finden und öffnen

Die bereits von KDevelop erstellten Dateien finden wir über den (vertikal gestellten) Punkt File Tree (in manchen Versionen auch File Selector genannt) an der linken Seite (Abbildung 1). Sämtliche Quelltexte finden sich im Ordner src, dessen Name kurz für "source", also Quelltexte, steht.

Unsere erste Änderung betrifft die Programmbeschreibung, die unsere Lieben wie bei jedem KDE-Programm im sogenannten About-Dialog unter Hilfe / Über Programmname nachlesen können. Den finden wir bereits fix und fertig programmiert in der Datei main.cpp. Dort ersetzen wir – je nach Version – den Text "A KDE APPLICATION" bzw. "A KDE KPart Application" in runden Klammern gegen "Fröhliche Weihnachten wünscht KDE":

static const char description[] =
I18N_NOOP("Fröhliche Weihnachten wünscht KDE");

Doch so wie unser Spruch nun im Quelltext steht, wird er nicht zwangsweise korrekt dargestellt. Das liegt daran, dass wir Umlaute benutzen, die die weltumspannend verstandene 7-Bit-ASCII-Kodierung nicht enthält. Diese Probleme umgehen wir, indem wir die Kodierung UTF-8 benutzen. Wählen wir im Menü Ansicht / Kodierung festlegen (View / Set Encoding) den Punkt UnicodeUTF-8 aus, kodiert KDevelop die gerade geöffnete Datei nach UTF-8 um. Dies sollten wir auf jeden Fall für die Dateien adventskalender.cpp und main.cpp machen.

Das Help-Menü generiert KDevelop automatisch, sobald die Applikation ein zweites Menü enthält. Tatsächlich sollten die Benutzerschnittstellen (wie auch Variablen- und Funktionsnamen) von KDE-Programmen in Englisch gehalten werden; erst in einem zweiten Schritt käme die Lokalisierung, die Übersetzung in andere Sprachen, in gesonderten Dateien an die Reihe. Um nicht zu sehr abzuschweifen, sparen wir uns diesen komplexen Schritt an dieser Stelle und beschriften das Userinterface auf Deutsch. Nur bei den Menüs müssen wir, besagter Automatik wegen, Kompromisse eingehen.

Um ein Menü namens File zu erstellen, das einen Eintrag zum Schließen des Programms enthält, modifizieren wir die Datei adventskalenderui.rc. Hierbei handelt es sich um eine Benutzerschnittstellenbeschreibung (ui.rc – "user interface record") in XML, aus der KDevelop später C++-Code generiert. Zwischen den Tags <MenuBar ...> und </MenuBar> ersetzen wir alles durch die Definition aus Listing 1.

Listing 1

Definition des Datei-Menüs in XML

<MenuBar>
<Menu name="file" noMerge="1">&File
<Action name="file_quit"/>
</Menu>
</MenuBar>

Sie beschreibt ein Menü namens file innerhalb der Menüleiste (englisch: menubar), das mit dem Text File beschriftet wird und bei dessen Anwahl der Unterpunkt (die "Aktion") file_quit sichtbar wird. Das kaufmännische Und-Zeichen & vor dem F sorgt dafür, dass sich das Menü später mit dem Tastenkürzel [Alt-F] öffnen lässt.

Noch fehlt allerdings eine Funktion, die die Menüeinträge auch im Menü erscheinen lässt. Hierfür deklarieren wir in der Header-Datei adventskalender.h, dass das adventskalender-Fenster, was ein Objekt der Klasse adventskalender ist, eine Funktion setupActions() kennen soll:

private:
 void setupActions();

void bedeutet, dass setupActions() nur etwas tut, aber keine Werte zurückgibt.

Abbildung 2: Das leere Hauptfenster

Da das Menü gleich bei der "Geburt" des adventskalender-Objekts eingebaut werden soll, schreiben wir den Funktionsaufruf in den Konstruktor adventskalender::adventskalender() der Klasse in der Datei adventskalender.cpp:

setupActions();

adventskalender-Objekte erben Eigenschaften und Funktionen der KMainWindow-Klasse, einer sehr komplexen KDE-Klasse zum Erstellen von Hauptfenstern. Damit setupActions() die Applikation überhaupt beendet, implementieren wir sie – weiterhin in adventskalender.cpp – so, dass sie eine KDE-Standard-Aktion aus den KDE-Bibliotheken aufruft, die die KDE-Anwendung schließt:

void adventskalender::setupActions()
{
KStdAction::quit(this, SLOT(close()), actionCollection());
}

Wenn wir den Menüpunkt Erstellen / Programm ausführen (Build / Execute Program) auswählen, baut KDevelop eine Applikation wie in Abbildung 2 zusammen, die sich über das File-Menü schließen lässt. Help / About zeigt den Dialog aus Abbildung 3.

Gibt der Programm-Erstellungsprozess (den der Nachrichten-Reiter unten links in KDevelop dokumentiert) vorzeitig auf, liegt das meist an fehlenden Entwicklungstools, Bibliotheken und Dev(el)-Paketen. Unter SuSE 8.1 meckerte KDevelop zum Beispiel die fehlende Datei libart_lgpl_2.la an:

libtool: link: cannot libart_lgpl_2.la

Diese liefern die beiden von SuSE geschnürten libart:lgpl-Pakete tatsächlich nicht mit; Abhilfe schafft ein Update auf die entsprechenden Archive vom KDE-Server [6].

Abbildung 3: Der fertige About-Dialog

Ohne Schokolade

Jetzt fehlen nur noch

  • 24 durchnummerierte Törchen mit Bildchen,
  • 24 Überraschungen, die sich dahinter verstecken und
  • ein Knecht Ruprecht, der aufpasst, dass kein Törchen zu früh geöffnet wird.

Für die Törchen nehmen wir Objekte der Klasse KPushButton, also Knöpfe. Um diese gleichmäßig auf 24 Plätzen zu verteilen, benutzen wir ein QGridLayout, ein Gitterlayout. Damit dieses nicht mit dem KMainWindow-eigenen Layout kollidiert (was uns bestenfalls eine Compiler-Warnung, schlimmstenfalls einen Programmabsturz einbrächte), betten wir das QGridLayout in ein QWidget namens dummy ein, ein generelles GUI-Element, das als Attrappe dient:

QWidget *dummy = new QWidget(this);
QGridLayout *layout = new QGridLayout (dummy, 4, 6);

Dem neuen (new) QGridLayout namens layout sagen wir in der runden Klammer, dass es sich ins eben erzeugte QWidget-Objekt dummy einfügen soll. Als weitere Argumente übergeben wir dem QGridLayout-Konstruktor die Information, dass wir 4 Reihen und 6 Spalten brauchen. Damit das überhaupt geht, müssen wir die QGridLayout-Definition aus der Header-Datei qlayout.h am Anfang von adventskalender.cpp einbinden (englisch: "to include"):

#include <qlayout.h>

Die spitzen Klammern besagen, dass die Datei in den systemweiten include-Verzeichnissen statt im Projektverzeichnis liegt. Unseren dummy setzen wir nun als zentrales Element ins KMainWindow: Es nimmt so den ganzen Platz im Hauptfenster ein und stellt ihn indirekt dem QGridLayout zur Verfügung:

this->setCentralWidget(dummy);

Das Stichwort this sagt, dass sich die Aktion auf das Objekt der Klasse adventskalender bezieht, deren Code wir gerade schreiben. Für eine weihnachtliche Stimmung färben wir das QGridLayout rot ein (Abbildung 4). Rot heißt in der Rot-Grün-Blau-(RGB-)Darstellung 255,0,0 (volle Ladung Rot, null Grün, kein Blau):

this->setBackgroundColor(QColor(255,0,0));
Abbildung 4: Das Programm hat nun einen roten Hintergrund

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Related content

  • Adventskalender mit C++ und Qt
    Es müssen nicht immer Schokoladefigürchen sein: Ein Bilderadventskalender lässt sich auch als GUI-Programm gestalten und eignet sich hervorragend zum Einstieg in die C++-Programmierung.
  • Programmieren mit Java und NetBeans
    Viele Computer-Liebhaber prägt eine Abneigung gegen herkömmliche Bastelei. Manche Menschen greifen mit Spaß zu Nadel und Faden, andere ziehen einen selbstprogrammierten Adventskalender vor. Wir geben eine Einführung in die Sprache Java [1] an Hand dieses Beispiels.
  • Adventskalender mit wxBasic
    Wer Silvester 2001 den guten Vorsatz fasste, im neuen Jahr endlich programmieren zu lernen, muss sich beeilen. Doch glücklicherweise sind Adventskalender dankbare Kandidaten, wenn es darum geht, eine überschaubare und nützliche Anwendung zu schreiben – dieses Jahr mit wxBasic.
  • GUI-Programmierung mit Qt Designer
    Wenn die Englisch-, C++- und Qt-Kenntnisse ausreichen, macht der Qt Designer grafische Benutzeroberflächen (GUIs) per Mausklick möglich.
  • The Answer Girl
    Dass der Computeralltag auch unter Linux des Öfteren für Überraschungen gut ist, ist eher eine Binsenweisheit: Immer wieder funktionieren Dinge nicht oder nicht so, wie eigentlich angenommen. Das Answer-Girl im LinuxUser zeigt, wie man mit solchen Problemchen elegant fertig wird.
Kommentare

Infos zur Publikation

title_2014_08

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 1 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...
o2 surfstick software für ubuntu?
daniel soltek, 15.07.2014 18:27, 1 Antworten
hallo zusammen, habe mir einen o2 surfstick huawei bestellt und gerade festgestellt, das der nic...
Öhm - wozu Benutzername, wenn man dann hier mit Klarnamen angezeigt wird?
Thomas Kallay, 03.07.2014 20:30, 1 Antworten
Hallo Team von Linux-Community, kleine Zwischenfrage: warum muß man beim Registrieren einen Us...
openSUSE 13.1 - Login-Problem wg. Fehler im Intel-Grafiktreiber?
Thomas Kallay, 03.07.2014 20:26, 8 Antworten
Hallo Linux-Community, habe hier ein sogenanntes Hybrid-Notebook laufen, mit einer Intel-HD460...
Fernwartung für Linux?
Alfred Böllmann, 20.06.2014 15:30, 7 Antworten
Hi liebe Linux-Freunde, bin beim klassischen Probleme googeln auf www.expertiger.de gestoßen, ei...