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

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)
Mandriva in Nöten
(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.

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:

QTextEdit

behandelt Zeilenumbrüche in solchen "Richtext"-Dateien wie bei echten HTML-Seiten wie Leerzeichen.

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 69 Punkte (1 Stimme)

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