Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0

...

Erstellen von Anwendungen mit grafischer Oberfläche
mit dem LINUX Desktop KDE 
Inhalt: 

Table of Contents


1 Einführung

 
Das Betriebssystem LINUX gewinnt immer mehr an Bedeutung, insbesondere in der Anwendung im professionellen Bereich. Im privaten Bereich ist die Zahl der Benutzer zwar ebenfalls steigend, aber die Zahl der Anwender, die sich an Ihre grafische Oberfläche ?Windows" gewöhnt haben, ist groß. 
Unter Linux gibt es eine Reihe von Windowmanagern, die unterschiedliche Entwicklerteams entworfen und auch zur stabilen Lauffähigkeit gebracht haben. Ein System kann jedoch nur dann Erfolg haben, wenn es Anwendungsentwicklern die Möglichkeit gibt, eine Vielzahl von Anwendungen schnell, effektiv und mit hoher Qualität zu erstellen. Nur wenn die Anzahl der Anwendungen hoch ist, werden auch die Endbenutzer dieses System akzeptieren und benutzen. 
Der Entwicklung von grafischen Oberflächen kommt daher eine hohe Bedeutung zu und wird in naher Zukunft mit hoher Wahrscheinlichkeit einen LINUX-Boom auslösen. 

2 Zielsetzung dieses Dokuments

 
Es soll in möglichst kompakter Weise ein Leitfaden zur Erstellung von grafischen Anwendungen unter LINUX gegeben werden. Häufig werden zum Thema ?Programmieren" Bücher mit bis zu 1000 Seiten angeboten. Dies soll hier ausdrücklich nicht Ziel sein ! 
Durch praktische Hinweise und Verweis auf bereits vorhandene Dokumentation soll die Möglichkeit des selbständigen Einarbeitens gegeben werden. Hierbei sollen frühzeitig Erfolgserlebnisse in Form von lauffähigen Programmen erzielt werden. Der Schwerpunkt liegt dabei nicht bei der Vermittlung der Sprache C/C++ sondern bei der Anwendung der Bibliothek ?Qt". 
Folgende Vorkenntnisse sollten vorhanden sein: 

  • Grundlagen UNIX
  • Grundlagen in der Sprache C und C++ / Objektorientierung
  • Nützlich aber nicht zwingend sind Kenntnisse in "Java" 
  • 3 Das Projekt KDE

 
Mit dem Projekt K-Desktop-Environment KDE (http://www.kde.org) wurde eine grafische Oberfläche geschaffen, die eine hohe Benutzerfreundlichkeit aufweist und auch für ?Windows"-umsteiger gute Möglichkeiten bietet sich zurecht zu finden. Die Verbreitung von KDE nimmt schnell zu. Es ist aber noch nicht abzuschätzen, ob es sich zum Standard durchsetzt. 
Aktuelle Version : KDE 1.1.1 

4 Das Tool "Qt", eine Klassenbibliothek

 
Das Tool ?Qt" (http://www.troll.no) ist eine Bibliothek von GUI-Elementen und Funktionen, die eine Entwicklung grafischer Anwendungen sehr ?einfach" ermöglichen, da es auch sehr gut dokumentiert ist. 

Wichtige Hinweise:
 
Wie unter LINUX üblich, sind für viele Programme und Tools keine Lizenzgebühren fällig, oder es gibt - wie hier beim Qt-Tool - eine sogenannte ?Free Edition", welche unter der GPL -Lizenz steht. Wenn die Absicht besteht, Programme für die externe Vermarktung zu erstellen, muß eine ?Professionell Edition" erworben werden. Die Lizenzbedingungen werden jeweils mitgeliefert oder können unter http://www.troll.no eingesehen werden. 
Aktuelle Version Qt 1.44


5 Vorbereiten der Entwicklungsumgebung

5.1 Softwareversionen

 
Dieser Abschnitt beruht auf der Festlegung, das folgende Softwareversionen verwendet werden: (andere Versionen haben ggf. andere Pfadangaben für Programme / Bibliotheken) 

...

  • Der Aufruf des Scripts ist ?qcc <Quelldatei>" , wobei die Quelldatei ohne die Endung ?cpp" eingegeben wird.
  • Die Pfadangaben für die Bibliotheken müssen ggf. angepaßt werden. (siehe Abschnitt 5.3 )
  • Für das unten behandelte Programm ?pushme" habe ich das Shellscript ?qccm" verwendet, welches eine Weiterentwicklung des qcc-Scripts ist. Hierbei wird auch der Meta-Object-Compiler (MOC) verwendet.(siehe unten im Abschnitt 9)
  • In der getesteten Version Qt 1.44 meldet das Script beim Linken eine Warnung, daß die Versionsnummer der Bibliothek nicht richtig währe. Diesen Hinweis kann man ignorieren. Er beruht auf der Tatsache, daß für das compilieren der Bibliotheken wiederum die EGCS-Bibliothek verwendet wurde. Die Verwendung der EGCS-Bibliothek in /usr/lib/gcc-lib/i486-linux/egcs-2.91.66 funktionierte aber nicht.

6 Übersicht über die GUI-Elemente der Qt-Bibliothek

 
Besondere Unterstützung erhält der Entwickler durch die im Qt-Tool mitgelieferte Objektbibliothek für die grafischen Elemente. Das bedeutet in der Praxis, daß der Entwickler nicht ?das Rad" neu erfinden muß, und für alle auf dieser Plattform entwickelten Programme ein einheitliches Erscheinungsbild existiert. 
Die einzelnen Elemente sind sehr gut dokumentiert, d.h. unter dem Verzeichnis /usr/doc/packages/qt/html befinden sich zu jeder Klasse html-Dokumente die wesentliche Informationen liefern. Diese Dokumentationsform erinnert sehr stark an das Java-Development-Kit (JDK). 
Zu jeder Klasse werden die Konstruktoren, Destruktoren, die enthaltenen Funktionen mit Aufruf- und Rückgabeparametern, die Membervariablen, sowie die Signale und Slots (vgl. Abschnitt 8) beschrieben.

...

Klassenname

Abbildung

QListView

 

QPrintDialog

 

QButtonGroup

 

QCheckBox

 

QComboBox
(Typ 1 von 3)

 

QFileDialog

 

QGroupBox

 

QHeader

 

QLabel

 

QLCDNumber

 

QLineEdit

 

QListBox

 

QMainWindow

 

QMenuBar

 

QMultiLineEdit

 

QMessageBox

 

QPopupMenu

 

QProgressBar

 

QProgressDialog

 

QRadioButton

 

QScrollBar

 

QScrollView

 

QSlider

 

QSpinBox

 

QStatusBar

 

QTabBar

 

QTabDialog

 

QTableView

 

 

7 An "Hello World" kommt man nicht vorbei.

Code Block
 
Dieses kleine Programm stellt ein Fenster mit einem einzelnen Button dar, welcher die Beschriftung ?Quit" trägt. Bei Betätigung dieses Buttons wird die Anwendung beendet. 
Es handelt sich bereits um eine vollständige Anwendung, d.h. es gibt ein Systemmenü und das Fenster kann in seiner Größe geändert werden. Allerdings wird auf diese Aktion noch nicht reagiert. Deshalb wird auch die Größe des Buttons nicht geändert, wenn sich die Größe des Fensters ändert. 
Dieses Beispiel kann nun mit Hilfe des im Abschnitt 5.4 beschriebenen Scripts compiliert werden und läuft dann nach Aufruf auf dem KDE-Desktop. 
Durch ?spielerisches Experimentieren" kann mit Hilfe der Qt-Dokumentation das Programm angepasst werden, wodurch weitergehende Funktionalitäten erlernt werden.  
Beispiele: Anpassen der Farben und Schriftarten, verändern der Positionen der Elemente, etc.  #include <qapplication.h>
#include <qpushbutton.h>
#include <qfont.h>
 int main(int argc, char **argv)
{
      //QApplication stellt das Anwendungsfenster mit Systemmenue bereit
      //und nimmt die Argumente aus der Befehlszeile auf
      QApplication a( argc , argv );
       //Ein neuer Button mit dem Titel "Quit" wird erstellt
      //Der Button erhaelt den Namen "quit" und wird in das aktuelle
      //Window gesetzt.
      QPushButton quit("Quit");
       //Der Button erhaelt die Groesse 75 Pixel breit, 30 Pixel hoch
      quit.resize(75,30);
       //Die Beschriftung des Buttons wird auf die Schriftart "Times"
      //18 Punkte hoch und Fettdruck eingestellt
      quit.setFont(QFont("Times",18,QFont::Bold));
       //Die Aktion "click" des Buttons "quit" wird mit der Funktion
      //"quit" der Anwendung "a" verbunden. Dies stellt eine Verbindung
      //in einer Richtung dar.
      QObject::connect(&quit,SIGNAL(clicked()),&a,SLOT(quit()));
       //Der Button "quit" wird zum Hauptelement der Anwendung erklaert
      //Hierdurch erhaelt das Anwendungsfenster die Groesse des Buttons
      a.setMainWidget(&quit);
       //Der Schalter wird angezeigt
      quit.show();
       //Die Anwendung gibt den Returncode der Applikation an die
      //aufrufende Shell zurück
      return a.exec();
}
 

8 Verarbeitung der Anwenderaktionen(Events),

SIGNALe und SLOTs
 

8.1 Allgemeines über Events

...

{
// Inhalt siehe Datei pumain.cpp

Anmerkung: Die Funktion sig_pressed wird nicht näher beschrieben. Dies wird vom MOC (è siehe Abschnitt 9) vorgenommen. Das Signal wurde hier nur eingebaut, um ein Beispiel zu geben. Es ist für den Programmablauf des Beispielprogramms ?pushme" ohne Belang. In der Funktion ?pressed()" wird am Ende mit dem Befehl ?emit" das Signal ausgesendet. (Ist hier auskommentiert) 
Sind alle Funktionen beschrieben, kann nun (probeweise !) der Compiliervorgang gestartet werden. Wird hierzu das mitge­lieferte Script ?qccm" verwendet, wird der MOC (èAbschnitt 9) gestartet. Für spätere eigene Programme kann hier der Hinweis gegeben werden, daß der Compiliervorgang auch ohne den MOC ?scheinbar" erfolgreich verläuft, aber dennoch keine SIGNALe funktionieren werden. Der Compiliervorgang sollte jedoch trotzdem vorher probeweise ohne den MOC durchgeführt werden, damit sichergestellt ist, daß alle Syntaxfehler beseitigt sind. 

9 Die Verwendung des Meta-Object-Compilers (MOC)

 
Mit Hilfe des MOC werden Informationen über die SIGNAL und SLOT- Mechanismen in der Anwendung in eine Datei geschrieben. Diese Datei stellt dann selbst ein cpp-Programm dar, welches mit den anderen Teilen der Anwendung compiliert und gelinkt werden muß. 
Konkret werden hier aus der Datei pumain.h Informationen in die Datei moc_pumain.cpp geschrieben. 
Hierzu lautet die Befehlszeile (siehe Datei ?qccm"): moc pumain.h -o moc_pumain.cpp
 
Dieser Befehl wird immer dann ausgeführt, wenn die Datei moc_pumain.cpp nicht existiert, oder diese älter als pumain.h ist. 
Die erzeugte Datei moc_pumain.cpp wird dann compiliert und gelinkt. 
Weitere Informationen über den MOC werden über den Befehl: 
man moc

angezeigt. 

10 Möglichkeit der Fehlersuche

 
Müssen während des Programmablaufs Werte von Variablen überprüft werden, kann dies mit dem Befehl ?debug" erfolgen. Dieser ist genau wie der C-Befehl ?printf" zu verwenden. Beispiel:
 
debug ("Es wurde der Schalter %s gedrückt",sender()->name()); 
 

11 Beispielsprogramm: Ein Schiebespiel

 

Wiki MarkupDer Sinn des Spiels ist die Sortierung der Spielsteine in einer numerischen Reihenfolge. Zu Beginn des Spiels werden die Steine in zufälliger Reihenfolge angeordnet. Ein Feld bleibt als Bewegungslücke frei. Klickt der Spieler auf einen an die Lücke angrenzenden Stein, wird dieser mit der Lücke vertauscht.&nbsp; Während der Spieldauer wird die Spielzeit in einer  
Während der Spieldauer wird die Spielzeit in einer LCD-Anzeige dargestellt.&nbsp;*{+}Events:+* Ereignisse sind die periodische Aktualisierung der Zeit, ein Klick auf einen Spielstein, ein Klick auf den Schalter ?Neues Spiel" und eine Veränderung des Wertes der Scrollbar. Letzteres führt zu einem neuen Spielbeginn, wodurch die Steine neu gemischt werden und die Spielzeit auf 0 gesetzt wird. \\ &nbsp;*{+}Realisierung:+* &nbsp; Kernstück des Programms ist die Steuerung der Spielsteine. Diese bestehen aus Objekten ?QPushButton", welche in einem Array dimensioniert sind. In einem zweidimenionalen Array mit Namen ?playarray \[\] \[\]" werden die Bezeichnungen der einzelnen Buttons gespeichert. Dies ist wichtig für:&nbsp; \-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Die Frage: ist ein Schalter mit diesem Namen bereits vorhanden (function array_exist ())  Events: Ereignisse sind die periodische Aktualisierung der Zeit, ein Klick auf einen Spielstein, ein Klick auf den Schalter ?Neues Spiel" und eine Veränderung des Wertes der Scrollbar. Letzteres führt zu einem neuen Spielbeginn, wodurch die Steine neu gemischt werden und die Spielzeit auf 0 gesetzt wird.
 Realisierung:
 
Kernstück des Programms ist die Steuerung der Spielsteine. Diese bestehen aus Objekten ?QPushButton", welche in einem Array dimensioniert sind. In einem zweidimenionalen Array mit Namen ?playarray [] []" werden die Bezeichnungen der einzelnen Buttons gespeichert. Dies ist wichtig für: 
-         Die Frage: ist ein Schalter mit diesem Namen bereits vorhanden (function array_exist ()) ?

-         den Tausch der Spielsteine bei einem Spielzug
(function swap_button(int,int))

-         die noch nicht implementierte Funktion des Spielendes, in dem alle Werte auf ihre richtige Reihenfolge hin geprüft werden. 

12 Literaturhinweise

 
Interessanter Vortrag zum Thema:

...