Home / LinuxUser / 2001 / 12 / Adventskalender mit C++ und Qt

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Eingedost
(161 Punkte bei 4 Stimmen)
Aufteiler
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.

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

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

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

Tip a friend    Druckansicht Bookmark and Share
Kommentare

2560 Hits
Wertung: 200 Punkte (22 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 05/2014

Aktuelle Ausgabe kaufen:

Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,95 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 60,60) können Sie im Medialinx-Shop bestellen.

Tipp der Woche

Bilder vergleichen mit diffimg
Bilder vergleichen mit diffimg
Tim Schürmann, 01.04.2014 12:40, 1 Kommentare

Das kleine Werkzeug diffimg kann zwei (scheinbar) identische Bilder miteinander vergleichen und die Unterschiede optisch hervorheben. Damit lassen sich nicht nur Rätsel a la „Orignial und Fäls...

Aktuelle Fragen

programm suche
Hans-Joachim Köpke, 13.04.2014 10:43, 8 Antworten
suche noch programme die zu windows gibt, die auch unter linux laufen bzw sich ähneln sozusagen a...
Funknetz (Web-Stick)
Hans-Joachim Köpke, 04.04.2014 07:31, 2 Antworten
Bei Windows7 brauche ich den Stick nur ins USB-Fach schieben dann erkennt Windows7 Automatisch, a...
Ubuntu 13.10 überschreibt immer Windows 8 Bootmanager
Thomas Weiss, 15.03.2014 19:20, 8 Antworten
Hallo Leute, ich hoffe das ich richtig bin. Ich habe einen Dell Insipron 660 Ich möchte gerne Ub...
USB-PTP-Class Kamera wird nicht erkannt (Windows-only)
Wimpy *, 14.03.2014 13:04, 15 Antworten
ich habe meiner Frau eine Digitalkamera, AGFA Optima 103, gekauft und wir sind sehr zufrieden dam...
Treiber
Michael Kristahn, 12.03.2014 08:28, 5 Antworten
Habe mir ein Scanner gebraucht gekauft von Canon CanoScan LiDE 70 kein Treiber wie bekomme ich de...