Fröhliche Weihnachten mit KDE
Adventskalender in C++
Blick hinter's Törchen
Wenn wir das Törchen wirklich öffnen dürfen, erstellen wir ein Objekt der Klasse behindDoor. Diese Klasse existiert bisher noch nicht, weshalb wir sie zunächst in unserer Header-Datei unterhalb der Klasse adventskalender deklarieren. Sie soll von der KDE-Klasse KDialog erben, die Dialog-Fenster erstellen kann. Dazu müssen wir oben in adventskalender.h die Header-Datei kdialog.h einbinden. Die Klassen-Deklaration für behindDoor sieht dann wie folgt aus:
class behindDoor : public KDialog
{
public:
behindDoor( int );
virtual ~behindDoor();
};
Dabei deklarieren wir den Konstruktor und einen virtuellen Destruktor: Prinzipiell besteht jede Klasse aus einem Konstruktor und einem Destruktor, der aufräumt, wenn ein Objekt der Klasse aufhört zu existieren. Bei unserer Klasse adventskalender erstellte KDevelop für uns den Destruktor. Jetzt schreiben wir selber eine Klasse und müssen ihn daher selbst deklarieren.
Ein virtueller Destruktor ermöglicht es erfahrenen Programmierer/innen, mit virtuellen Funktionen zu einer eleganteren Lösung als der im folgenden beschriebenen zu kommen. Wir beschäftigen uns lieber mit einfacheren Dingen und kümmern uns um den Konstruktor. Er wünscht sich als Argument eine positive oder negative ganze Zahl (int ).
Nun füllen wir diesen Konstruktor in adventskalender.cpp mit Leben, und zwar gleich am Dateianfang, direkt unter den eingebundenen Header-Dateien:
behindDoor::behindDoor( int day ) : KDialog( 0, "dialog" ){ }
Mit day können wir nun auf das Integer-Argument zugreifen.
Unter diesem Konstruktor erstellen wir direkt den virtuellen Destruktor. Dieser bleibt jedoch leer:
behindDoor::~behindDoor(){ }24 Überraschungen
Im Konstruktor nutzen wir eine switch-Anweisung. Sie besteht aus 24 Fällen ("cases"), in denen wir für jeden Tag eine andere Textdatei einbinden, die sich als Überraschung hinter dem Törchen versteckt. Hierfür brauchen wir 24 Textdateien mit Gedichten, Rezepten u. ä., die wir mit der Namensendung .txt abspeichern.
Zunächst benötigen wir allerdings ein QFile-Objekt, das diese Textdateien auslesen und sichtbar machen kann:
QFile file;
Natürlich müssen wir hierfür die qfile.h-Datei einbinden. file setzen wir in jedem case der switch-Anweisung auf den Namen und den Pfad unserer Textdatei. Für letzteren darf einmal mehr der Platzhalter appdata herhalten. Das sieht für den 1. Dezember so aus:
case 1:
{
file.setName(locate("appdata","adventskranz.txt" ));
break;
}
Hinter jedem case geben wir den Tag in Form einer Zahl von 1 bis 24 als Bedingung an. Eine break-Anweisung gehört ans Ende jedes fertig bearbeiteten Falls. Damit verlassen wir die switch-Anweisung und verhindern so, dass sich alle Törchen öffnen, obwohl wir nur eins angeklickt haben. Den Code für den ersten case kopieren wir und fügen ihn weitere 23 Mal ein. Anschließend brauchen wir nur noch den jeweiligen Tag hinter case und den Namen der auszulesenden Textdatei ändern.
Die gefundene Datei müssen wir nach der switch-Anweisung noch in einem Fenster sichtbar machen. Dafür öffnen wir sie mit file.open( IO_ReadOnly ) im Nur-Lese-Modus. Gelingt dies (wir prüfen es mit einer if-Anweisung), benötigen wir einen "Texteditor" in Form von QTextEdit, der den Dateiinhalt darstellt:
QTextEdit *edit = new QTextEdit( file.readAll(), QString::null, this );
Dieser steht auf die include-Anweisung für qtextedit.h hin zur Verfügung. Mit file.readAll() lesen wir das ganze Dokument ein.
Diesem QTextEditor sagen wir nun, dass er nur gelesen, nicht jedoch verändert werden darf. Außerdem frieren wir ihn auf eine feste Größe ein und legen mit Hilfe eines RGB-Werts seine Hintergrundfarbe fest:
edit->setReadOnly( true ); edit->setFixedSize( this->width(), this->height() ); edit->setPaletteBackgroundColor ( QColor (255, 235, 235 ) );
Wenn wir die ausgelesene Datei nicht mehr benötigen, schließen wir sie:
file.close();
Den Text sehen wir ja bereits im entsprechenden Fenster. Damit darin kein hässlicher grauer Rahmen entsteht, brauchen wir ein Layout, in dem unser Rezept oder Gedicht dargestellt wird. Dazu benutzen wir ein QVBoxLayout mit vertikaler Ausrichtung. Wir erstellen es mit
QVBoxLayout *l = new QVBoxLayout(this);
und fügen den Texteditor mit dem ausgelesenen Text ein:
l->addWidget(edit);
Kasten 1: Der Schokoladenüberzug@KL:Um unsere Rezepte und Gedichte noch ein wenig zu versüßen, können wir sie mit HTML-Tags versehen. Erlaubt sind allerdings nur grundlegende Formatierungen wie
<b></b>für Fettdruck oder
<i></i>für kursiven Text. Dann muss man das Dokument allerdings mit
<qt></qt>umschließen und mit
<p></p>oder
<br>in einzelne Absätze unterteilen:
QTextEditbehandelt Zeilenumbrüche in solchen "Richtext"-Dateien wie bei echten HTML-Seiten wie Leerzeichen.



