KDE-Programmierung


[ Seminar Linux, WWW, Java und Internet ] ... [ Thema KDE ] ... [ Ein Blick in die Zukunft ]

Übersicht


Von Qt zu KDE

Das im letzten Kapitel entwickelte Hello world-Programm soll nun zu einer waschechten KDE-Anwendung gemacht werden.
   hellokde.cpp
   1 #include <kapp.h>
   2 #include <qlabel.h>
   3 #include <qpushbutton.h>
   4
   5 int main(int argc, char* argv[])
   6 {
   7   KApplication myApp(argc, argv);
   8
   9   QWidget* myWidget = new QWidget();
  10   myWidget->setGeometry(400, 300, 120, 90);
  11 
  12   QLabel* myLabel = new QLabel("Hello world", myWidget);
  13   myLabel->resize(80, 30);
  14 
  15   QPushButton* myQuitButton = new QPushButton("Quit", myWidget);
  16   myQuitButton->setGeometry(10, 50, 100, 30);
  17   QObject::connect(myQuitButton, SIGNAL(clicked()), &myApp, SLOT(quit()));
  18 
  19   myApp.setMainWidget(myWidget);
  20   myWidget->show();
  21
  22   return myApp.exec();
  23 }
  
Im Vergleich zur letzten Programmversion hat sich nicht allzuviel geändert. Der einzige Unterschied besteht darin, dass anstatt der Klasse QApplication diesmal KApplication verwendet wird. Deshalb muss auch statt der Headerdatei qapplication.h die Datei kapp.h eingebunden werden. Beim Übersetzen kommen jetzt noch drei neue Parameter hinzu die dafür sorgen, dass die KDE-Bibliotheken gefunden werden.

$> g++ -I$QTDIR/include -I$KDEDIR/include -L$QTDIR/lib -L$KDEDIR/lib -lqt -lkdecore -o hellokde hellokde.cpp

Führt man das Programm jetzt aus, scheint es auch optisch keine grossen Unterschiede zur reinen Qt-Version zu geben.

[Hello KDE]

Aber das liegt eigentlich nur daran, dass der Standardfont auf dem System dem Standard-Qt-Font sehr ähnlich sieht. Wählt man im KDE Kontrollzentrum mal eine andere Schriftart so sieht man, dass man durch den Austausch eines Buchstaben eine ganz neue Funktionalität hinzugewonnen hat. Das 'Look & Feel' dieser Anwendung lässt sich nun mit dem KDE-Kontrollzentrum konfigurieren.

[Hello KDE - mit einem anderen Standardfont]


Ein etwas umfangreicheres Beispiel

Um die Möglichkeiten, die sich dem Entwickler mit KDE bieten, ein wenig anzudeuten, folgt hier jetzt ein etwas aufwendigeres Beispiel.
   hellokde.cpp
   1 #include <kapp.h>
   2 #include <kmenubar.h>
   3 #include <ktmainwindow.h>
   4 #include <qlabel.h>
   5 #include <qkeycode.h>
   6
   7 int main (int argc, char **argv)
   8 {
   9   const char *aboutText = "Hello KDE\nvon Thorsten Ehlers";
  10 
  11   KApplication myApp(argc, argv);
  12   KTMainWindow* mainWidget = new KTMainWindow;
  13 
  14   QPopupMenu *filePopup = new QPopupMenu ();
  15   filePopup->insertItem(i18n("&Quit"), &myApp, SLOT (quit()), CTRL + Key_Q);
  16 
  17   KMenuBar *menuBar = mainWidget->menuBar();
  18   menuBar->insertItem(i18n("&File"), filePopup);
  19   menuBar->insertSeparator();
  20   menuBar->insertItem(i18n("&Help"), myApp.getHelpMenu(TRUE, aboutText));
  21 
  22   QLabel* myLabel = new QLabel(i18n("Hello world"), mainWidget);
  23   myLabel->setAlignment(AlignCenter);
  24   myLabel->setFont(QFont("charter", 64, QFont::Bold, TRUE));
  25   myLabel->setMinimumSize(myLabel->sizeHint());
  26   mainWidget->setView(myLabel);
  27
  28   myApp.setMainWidget(mainWidget);
  29   mainWidget->show();
  30
  31   return myApp.exec();
  32 }
  
Zu den Neuerungen dieser Version gehört unter anderem auch eine Menüzeile. In den Zeilen 14 und 15 wird zuerst einmal ein Popup-Menü erzeugt, das erscheinen soll, wenn im Hauptmenü auf File geklickt wird. Dieses Popup-Menü enthält nur einen einzigen Eintrag: Quit. Dieser Eintrag wird mit dem Slot quit() der KApplication verbunden. Desweiteren wird noch ein globaler Shortcut STRG+Q definiert, dessen Eingabe genau wie die Auswahl des Menüpunktes eine Beendigung des Programmes zur Folge hat.
Das Hauptmenü wird in den Zeilen 17 bis 20 erzeugt. Es enthält zwei Einträge: unter File findet sich das bereits beschriebene Dateimenü und unter Help verbirgt sich das Standardhilfemenü des KDE. Dieses bietet dem Anwender die Möglichkeit, unter Contents das Programm KDE Help mit der Anleitung der Applikation zu starten, sowie mit About hellokde... bzw. About KDE... einen Informationsdialog zur Applikation oder KDE zu öffnen.

Ein weiteres Novum ist das Makro i18n (eine abkürzende Schreibweise für KApplication::getKApplication()->getLocale->translate(char* )), das alle im Programm vorkommenden Texte umklammert. Dadurch wird es möglich, dass der geklammerte Text später in der jeweils eingestellten Landessprache ausgegeben wird.

Da diesmal auch KDE-Klassen mit einer graphischen Repräsentation verwendet werden, muss beim Binden auch die Bibliothek libkdeui verwendet werden.

$> g++ -I$QTDIR/include -I$KDEDIR/include -L$QTDIR/lib -L$KDEDIR/lib -lqt -lkdecore -lkdeui -o hellokde hellokde.cpp

[Hello KDE - mit allem drum und dran]


KDE-Klassen

Neben den Klassen, die Qt dem Entwickler bereitstellt, enthält auch das KDE-Paket eine Reihe nützlicher Klassen, von denen einige hier kurz vorgestellt werden sollen.

Internationalisierung mit KLocale und i18n

KDE stellt dem Entwickler eine komfortable Möglichkeit zur Verfügung, um seine Anwendungen in vielen Sprachen anzubieten. Große Bedeutung kommt dabei dem Makro i18n() zu, das bereits im vorherigen Beispiel angewendet wurde. Die Abkürzung i18n steht übrigens für 'internationalisation', wobei die 18 die achtzehn ausgelassenen Buchstaben repräsentiert.
Der erste Schritt zur Internationalisierung eines KDE-Programmes ist es, alle Zeichenketten, die von der Anwendung ausgegeben werden, mit dem Makro i18n zu umgeben. Aus QLabel("Hello world", mainWidget); wird beispielsweise QLabel(i18n("Hello world"), mainWidget);.
Im nächsten Schritt muss die Anweisung

$> xgettext -C -ki18n hellokde.cpp

ausgeführt werden. Dadurch werden alle Zeichenketten, die übersetzt werden sollen, in die Datei messages.po geschrieben. Diese Datei bildet die Grundlage für jede Übersetzung. Um eine neue Sprachversion zu erzeugen, muss man nur die Datei in eine andere Datei umkopieren, deren Name sich aus dem Länderkürzel sowie der Endung .po zusammensetzt. Für eine deutsche Version hieße die Datei also de.po. Zu dem obigen Programmbeispiel gehört folgende Datei:
     messages.po
     # SOME DESCRIPTIVE TITLE.
     # Copyright (C) YEAR Free Software Foundation, Inc.
     # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
     #
     #, fuzzy
     msgid ""
     msgstr ""
     "Project-Id-Version: PACKAGE VERSION\n"
     "POT-Creation-Date: 1999-10-24 22:10+0200\n"
     "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
     "Last-Translator: FULL NAME \n"
     "Language-Team: LANGUAGE \n"
     "MIME-Version: 1.0\n"
     "Content-Type: text/plain; charset=CHARSET\n"
     "Content-Transfer-Encoding: ENCODING\n"

     #: hellokde.cpp:15
     msgid "&Quit"
     msgstr ""

     #: hellokde.cpp:18
     msgid "&File"
     msgstr ""

     #: hellokde.cpp:20
     msgid "&Help"
     msgstr ""

     #: hellokde.cpp:22
     msgid "Hello world"
     msgstr ""
  
Um jetzt eine Zeichenkette zu übersetzen, muss die Übersetzung bloss in die Anführungsstriche hinter msgstr gesetzt werden.


[ Seminar Linux, WWW, Java und Internet ] ... [ Thema KDE ] ... [ KDE-Programmierung ] ... [ Ein Blick in die Zukunft ]