advcal_offen.png

Vorfreude, schönste Freude

Adventskalender mit C++ und Qt

01.12.2001
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.

Wenn der 1. Dezember naht und kein Adventskalender Büro oder Stube ziert, macht sich bei nicht allzu wenigen großen Kindern die Enttäuschung breit. Warum also nicht selbst einen stricken und dem Freundes- oder Kollegenkreis verehren?

Um das Angenehme mit dem Nützlichen zu verbinden, suche man sich eine Herstellungsweise, die man selbst schon immer einmal lernen wollte (Adventskalender sind derart kurzlebig, dass bei der/dem Beschenkten die kindliche Freude über den Verdruss angesichts der nicht zu übersehenden Laienhaftigkeit der Herstellung überwiegen wird). Ob Sie nun Laubsägerei, Origami oder eben auch GUI-Programmierung lernen wollen, bleibt Ihnen überlassen, doch da Sie von einer Linux-Zeitschrift vermutlich keine Anleitungen zum Umgang mit Holz und Buntpapier erwarten, wenden wir uns an dieser Stelle dem letztgenannten Thema zu.

Das Handwerkszeug

Am Anfang jedes Programmierprojekts steht die Frage nach dem Werkzeug. Den Texteditor suchen Sie sich am besten selbst aus. Fehlt noch die Programmiersprache (und der entsprechende Compiler bzw. Interpreter) sowie die Frage nach dem Grad der Faulheit. Hardcore-Programmierer/innen mögen mit der Xlib-Bibliothek direkt auf dem X-Window-System arbeiten und jede Linie des Programms pixelgenau "per Hand" zeichnen [1]. Doch viel praktischer ist es, sich ein GUI-Toolkit auszusuchen, das Elemente einer grafischen Benutzeroberfläche wie Knöpfe (Buttons), Auswahllisten, Karteikartenreiter, Menüs und Werkzeugleisten als vorgefertigte Klassen bereitstellt und auch sonst allerhand Erleichterung für die Programmiererin bietet.

Die am weitesten verbreiteten Open-Source-GUI-Toolkits sind GTK+ [2] (bekannt von Gimp oder GNOME), Qt [3] (auf dem u. a. KDE basiert) und Tk [4] (meist im Zusammenhang mit der Skript-Sprache Tcl verwendet). Mit der Festlegung auf ein Toolkit bleibt jedoch keine allzu große Freiheit mehr bei der Wahl der Programmiersprache, obwohl sowohl für GTK abseits von C, Qt abseits von C++ und Tk abseits von Tcl weitere Language bindings existieren.

Bleiben wir bei einer kompilierten Sprache (der Inhalt eines Adventskalenders sollte für seine Benutzer/innen besser erst nach Weihnachten offen zugänglich sein) und entscheiden uns für C++ mit Qt, das auch für andere Unix-Betriebssysteme, Windows und seit kurzem für MacOS X existiert. Ob Qt kostenlos unter Open-Source-Lizenzen (GPL oder QPL) verwendet werden darf oder ob man eine kommerzielle Ausgabe kaufen muss, hängt von der Lizenz des geplanten Softwareprojekts ab.

Attraktiv an Qt ist, dass die Herstellerfirma Trolltech ein GUI-Programm namens designer mit dem Qt-Paket mitliefert, mit dem sich grafische Oberflächen maustechnisch zusammenklicken lassen. (Auch für GTK gibt es ein solches "Rapid Application Development"-(RAD-)Tool namens Glade [5].) Allerdings sollte man davon keine Wunder erwarten: Um die Einstellmöglichkeiten (und teilweise auch die Funktionsweise) des Designers zu verstehen, sind Qt-Grundkenntnisse unabdingbar. Zudem kommt es sehr auf den Einsatzzweck an, ob das Programm nutzbringend verwendet werden kann: Den im Folgenden zu erstellenden Adventskalender weitgehend im Designer zu bauen, ist um Einiges umständlicher als die Programmierung "von Hand".

Wer Qt nicht selbst kompiliert, sollte darauf achten, dass nicht nur das Paket mit den Laufzeitbibliotheken (meist schlicht qt-Versionsnummer oder qt2-Versionsnummer genannt), sondern auch das qt(2)-devel-Paket mit den Qt-Header-Dateien und dem "Meta Object Compiler" moc installiert ist. Der Befehl rpm -qagrep qt listet bei RPM-basierten Distributionen die installierten Qt-Pakete auf. Obwohl Qt 3.0 zum Redaktionsschluss erschien, verwenden wir im Folgenden die letzte stabile Version 2.3.1, die aktuelleren Distributionen beiliegt. Der Source-Code kompiliert aber auch mit Qt 3.0 oder etwas älteren Ausgaben problemlos.

Ein C++-Compiler (gern der g++ aus der GNU-Compiler-Suite GCC) und das make-Tool runden die Ausstattung ab. Doch da das Erstellen von Makefiles für Qt-Programme nicht gerade ein Zuckerschlecken ist, empfiehlt sich zudem die Installation des tmake-Skripts [6], das bei SuSE nicht etwa in einem tmake-RPM, sondern unter qt-freebies logiert. Qt-3.0-Benutzer/innen dürfen stattdessen auf die Neuimplementierung qmake [7] zurückgreifen, die ähnlich funktioniert und sogar in der Qt-Distribution enthalten ist.

Ehe tmake sich jedoch zum Zusammenbauen von Linux-Makefiles eignet, muss die Variable TMAKEPATH auf das Verzeichnis gesetzt werden, das die tmake-Templates und -Konfigurationsdateien für die entsprechende Plattform enthält. Für Linux mit dem g++ heißt es linux-g++ und ist etwa unter /usr/share/tmake/lib (Caldera) oder /usr/lib/tmake (SuSE) zu finden.

Zudem muss die Umgebungsvariable QTDIR das Verzeichnis beinhalten, in dem das include-Directory mit den Qt-Header-Dateien und das lib-Unterverzeichnis mit den Bibliotheksdateien für die passende Qt-Version liegen. Meist ist das /usr/lib/qt2echo $QTDIR zeigt, ob dem so ist.

Es geht um Inhalte

Noch ehe wir mit dem Programmieren beginnen, lohnt es, sich über Aussehen und Inhalt des Kalenders Gedanken zu machen: Nahe liegen 24 quadratische Bildchen, die in vier Zeilen und sechs Spalten angeordnet sind und vor dem Öffnen von einem Deckelchen unter Verschluss gehalten werden. Ein 25. Bildchen darf den geschlossenen Türchen ihre Langweiligkeit nehmen (Abbildung 1).

Abbildung 1: Das Ziel – der Adventskalender mit geschlossenen Türchen

Vom ästhetischen Standpunkt wünschenswert ist eine einheitliche Hintergrundfarbe der 24 Bilder, während Nr. 25 mit der Grundfarbe der Applikation selbst harmonieren sollte. Hier kommt man um ein wenig Bildbearbeitung nicht herum: Abbildung 2 zeigt beispielweise, wie sich mit dem Color Editor (Windows / Color Editor) des Programms xv [8] einzelne Farben ändern lassen.

Abbildung 2: Mit den Red-, Green- und Blue-Rädern ändert man einzelne Farben im xv-Color-Editor

Außerdem wird das Leben einfacher, wenn alle Bildchen im (von Qt verstandenen) xpm-Format und auf eine einheitliche Größe skaliert vorliegen. Befinden sich etwa alle Bilddateien im gif-Format in einem Sammelverzeichnis, hilft das convert-Tool aus dem ImageMagick-Paket [9] beim Konvertieren und Skalieren:

for bild in *.gif; do
 convert -geometry 64x64 $bild `basename $bild gif`xpm
 done
convert -geometry 64x64  tuer.gif tuer.xpm

Dieses kleine Shell-Skript geht der Reihe nach alle Dateien mit der Endung .gif durch und skaliert sie auf maximal 64x64 Pixel herunter (die Proportionen bleiben dabei erhalten, sodass ein Bild, das höher als breit ist, mit einer Höhe von 64 Pixeln, aber einer geringeren Breite herauskommt). Gleichzeitig wandelt convert das Ergebnis dank entsprechender Dateiendungsangabe ins xpm-Format um und legt es unter dem alten Dateinamen, aber mit der Endung .xpm statt .gif ab.

Wer sich eine so entstandene XPM-Datei einmal anschaut, sieht schnell, warum sich dieses Format gut zum Programmieren in C(++) eignet:

static char *magick[] = { […] }

Das Bild liegt bereits als Zeiger (*) auf ein Feld (Array) ([]) vom Datentyp char ("character" – (druckbares ASCII-)Zeichen) vor. Liest man das entsprechende File mit #include in eine Quellcode-Datei ein, kann man ihn unter dem Namen magick sofort ansprechen. Allerdings mag Qt XPMs lieber als Konstanten, weshalb static char * in static const char* zu ändern wäre. Zudem dürfen natürlich nicht alle 25 Zeiger magick heißen – besser wäre etwa bild_dateiname (z. B. bild_1 bis bild_24 und bild_tuer). Das lässt sich mit sed und einem kleinen Shell-Skript erledigen:

for file in *.xpm; do
 sed -e "s/char \*magick/const char\* bild_`basename $file .xpm`/" $file > _$file
 mv _$file $file
 done

sed ersetzt das erste Auftreten von char *magick in einer Zeile durch const char* bild_ plus den Dateinamen des aktuell bearbeiteten Files ohne die Dateiendung .xpm. Der Zeiger in der Datei 1.xpm wird so in bild_1 umbenannt. Da das Sternchen in derlei regulären Ausdrücken eine Sonderbedeutung hat, muss es durch ein \ geschützt werden. Die veränderten Daten landen in einer temporären Datei _originalDateiname.xpm, mit der anschließend die Originaldatei überschrieben wird (mv).

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • 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.
  • 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.
  • Adventskalender in C++
    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.
  • 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.
Kommentare

Infos zur Publikation

LU 11/2014: VIDEOS BEARBEITEN

Digitale Ausgabe: Preis € 4,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

WLAN-Signalqualität vom Treiber abhängig
GoaSkin , 29.10.2014 14:16, 0 Antworten
Hallo, für einen WLAN-Stick mit Ralink 2870 Chipsatz gibt es einen Treiber von Ralink sowie (m...
Artikelsuche
Erwin Ruitenberg, 09.10.2014 07:51, 1 Antworten
Ich habe seit einige Jahre ein Dugisub LinuxUser. Dann weiß ich das irgendwann ein bestimmtes Art...
Windows 8 startet nur mit externer Festplatte
Anne La, 10.09.2014 17:25, 6 Antworten
Hallo Leute, also, ich bin auf folgendes Problem gestoßen: Ich habe Ubuntu 14.04 auf meiner...
Videoüberwachung mit Zoneminder
Heinz Becker, 10.08.2014 17:57, 0 Antworten
Hallo, ich habe den ZONEMINDER erfolgreich installiert. Das Bild erscheint jedoch nicht,...
internes Wlan und USB-Wlan-Srick
Gerhard Blobner, 04.08.2014 15:20, 2 Antworten
Hallo Linux-Forum: ich bin ein neuer Linux-User (ca. 25 Jahre Windows) und bin von WIN 8 auf Mint...