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

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Mandriva gibt Distribution in die Hände der Community
(268 Punkte bei 24 Stimmen)
Neues vom Systemd
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

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

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

1507 Hits
Wertung: 149 Punkte (7 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 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 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...