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
 

Ähnliche Artikel

  • 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 der QEMU-Macher
    Die Entwickler der Virtualisierungslösung QEMU bieten auf ihren Seiten einen etwas ungewöhnlichen Adventskalender an: Bis zum 24. Dezember gibt es dort jeden Tag eine virtuelle Maschine mit ganz besonderen Inhalten.
  • 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.
Kommentare

Infos zur Publikation

LU 01/2015: E-Books im Griff

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

Ubuntu 14.10 und VirtualBox
Ubuntu 14.10 und VirtualBox
Tim Schürmann, 08.11.2014 18:45, 0 Kommentare

Wer Ubuntu 14.10 in einer virtuellen Maschine unter VirtualBox startet, der landet unter Umständen in einem Fenster mit Grafikmüll. Zu einem korrekt ...

Aktuelle Fragen

PCLinuxOS Version 2014.08 "FullMonty" Umstellung auf deutsch
Karl-Heinz Welz, 19.12.2014 09:55, 3 Antworten
Hallo, liebe Community, ich bin 63 Jahre alt und möchte jetzt nach Jahrzehnten Windows zu Linux...
ICEauthority
Thomas Mann, 17.12.2014 14:49, 2 Antworten
Fehlermeldung beim Start von Linux Mint: Could not update ICEauthority file / home/user/.ICEauth...
Linux einrichten
Sigrid Bölke, 10.12.2014 10:46, 5 Antworten
Hallo, liebe Community, bin hier ganz neu,also entschuldigt,wenn ich hier falsch bin. Mein Prob...
Externe USB-Festplatte mit Ext4 formatiert, USB-Stick wird nicht mehr eingebunden
Wimpy *, 02.12.2014 16:31, 0 Antworten
Hallo, ich habe die externe USB-FP, die nur für Daten-Backup benutzt wird, mit dem YaST-Partition...
Steuern mit Linux
Siegfried Markner, 01.12.2014 11:56, 2 Antworten
Welches Linux eignet sich am besten für Steuerungen.