Home | Lehre | Videos | Texte | Vorträge | Software | Person | Impressum, Datenschutzerklärung | Blog RSS

KDE-Grundlagen


Das "K Desktop Environment" ist:

Qt ist plattformübergreifend für das X Window System und für Microsoft® Windows® erhältlich. Als Qt Free Edition ist Qt mit GNU-Lizenz (GPL, General Public License) verfügbar und kann so zur Entwicklung freier Software verwendet werden, die dann ebenfalls der GPL unterliegt. Zur Entwicklung kommerziell vertriebener Software mit Qt muss man von Trolltech eine entsprechende Lizenz kaufen!

Der wichtigste KDE-Konkurrent: GNOME. Er stammt von der GUI-Bibliothek des Bildbearbeitungsprogramms GIMP ab. Programmierschnittstelle: Sammlung von C-Funktionen namens GTK+ (GIMP ToolKit), Anbindungen an diverse Sprachen, z.B. objektorientiert in C++ als Gtk--. GNOME unterliegt nicht der GPL, sondern der LGPL (Library General Public License), darf also in kommerzieller Software als Bibliothek verwendet werden.

Allgemeine Events, zum Beispiel für Mausklicks oder zum Neuzeichnen resultieren im Aufruf virtueller Methoden wie mousePressEvent(...) oder paintEvent(...). Die Widget-Methode update() fordert ein Neuzeichnen an, repaint() ruft sofort (anders als die gleichnamige Methode in Java® Swing®!) die zum Neuzeichnen zuständige Methode paintEvent(...) auf. Der Grafikkontext ist ein Objekt vom Typ QPainter. QPen und QBrush werden analog zu Microsoft® MFC® verwendet; Double-Buffering ist ebenfalls nicht sofort eingebaut.

Zur Kommunikation zwischen den Objekten verwendet Qt Erweiterungen von C++, und zwar Q_OBJECT als Steuerhinweis in Klassendeklarationen, signals:, slots: und emit. Diese neuen Syntax-Elemente werden über einen zusätzlichen Präprozessor (moc: Meta Object Compiler) in normalen C++-Code verwandelt. Vor dem Start des C++-Compilers (g++) muss man für alle Header-Dateien mit solchen Elementen moc aufrufen. In den zugehörigen Implementierungsdateien (.cpp) ruft man per #include statt der ursprünglichen Header-Dateien die so entstandenen .moc-Dateien auf. Der Aufruf gleich zweier Compiler schreit nach einer Anwendung von make!

Mit dem Signal/Slot-Mechanismus können Objekte Kommandos (kein Argument) oder beliebige Daten austauschen (Argumente in Signal und Slot). Slots sind in der .cpp-Datei auszuprogrammieren; Signals kommen nur in der .h-Datei vor. Über den connect-Befehl werden Signale mit Slots verdrahtet, wahlweise auch Slots oder Signals mehrfach verbunden, mit jeweils eigenen connect-Befehlen. Im Beispielprogramm siehe: Steuerung der LED-Anzeige und Wirkung des Schiebereglers. Vorsicht: Der Compiler überprüft bei connect nicht, ob die angebenen Funktionen existieren, also Ärger mit Schreibfehlern.

Ein Objekt gibt ein Signal aus, indem es die entsprechende, in seinem Header unter signals: deklarierte (Pseudo-)Methode aufruft. Laut Trolltech-Dokumentation muss vor diesem Aufruf das Schlüsselwort emit stehen. Tatsächlich ist emit aber bedeutungslos, zumindest derzeit unter Unix: Der Präprozessor löscht das Schlüsselwort einfach. Man könnte also statt emit meinSignal(42); auch emit emit emit meinSignal(emit 42 emit) emit; schreiben -- oder ganz schlicht meinSignal(42);.

Ein Signal-Aufruf arbeitet alle damit verbundenen Slots ab. Deren Reihenfolge ist dabei undefiniert. Das Programm kehrt erst danach zum Befehl nach dem Signal-Aufruf zurück. Ganz anders bei Events mit Warteschlangen!

Slots können virtuelle Methoden sein. Ein public slot kann überall mit Signalen verbunden werden, ein protected slot nur in der Klasse selbst oder abgeleiteten Klassen, ein private slot nur in der Klasse selbst. Signals sind dagegen gar nicht public/protected/private deklariert.

Viele Kommandos kommen mehrfach vor: Menü, Toolbar, Button, Tastaturkürzel. Idee in KDE 2.0: Alle inhaltlich gleichen Kommandos (Beispiel: "Ausschneiden") zu einer "Aktion" zusammenfassen und diese zentral einrichten (und z.B. auch zentral auf Grau stellen). Aktionen im Beispielprogramm: Menüeinträge. "Beenden" benutzt ein vordefiniertes Standard-Tastaturkürzel. Beachte: plug-Methode von Aktion aufrufen, um sie an Menü anzuschließen, nicht umgekehrt eine Methode des Menüs aufrufen.

Menüzeile und Statusleiste holt man vom Hauptfenster (Klasse KMainWindow) mit den Methoden menuBar() und statusBar().