Home / LinuxUser / 2003 / 12 / Adventskalender in C++

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Debian leicht gemacht
(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.

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

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

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

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

Abbildung 4: Das Programm hat nun einen roten Hintergrund

Tip a friend    Druckansicht Bookmark and Share
Kommentare

1517 Hits
Wertung: 113 Punkte (11 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

Owncloud mit Linuxmint 15 32 Bit
Santana Muggel, 24.04.2014 16:45, 0 Antworten
Hallo, ich habe nach dem Artikel in Heft 05.2014 versucht, owncloud einzurichten. Bei der Inst...
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...