Melden Sie sich hier an, um auf Kommentare und die Whitepaper-Datenbank zugreifen zu können.

Kein Log-In? Dann jetzt kostenlos registrieren.

Falls Sie Ihr Passwort vergessen haben, können Sie es hier per E-Mail anfordern.

Der Zugang zur Reseller Only!-Community ist registrierten Fachhändlern, Systemhäusern und Dienstleistern vorbehalten.

Registrieren Sie sich hier, um Zugang zu diesem Bereich zu beantragen. Die Freigabe Ihres Zugangs erfolgt nach Prüfung Ihrer Anmeldung durch die Redaktion.

08.11.2006

Qt hält Software plattformneutral

Dr. Christian Dietrich 
Software sollte plattformunabhängig erstellt werden, sonst gleicht eine spätere Portierung fast einer Neu- implementierung. Bezüglich der grafischen Steuerelemente bieten sich hierfür die Qt-Klassenbibliotheken an.

Es ist nachvollziehbar, dass viele Firmen erst spät im Entwicklungsprojekt darüber nachdenken, ob eine Anwendung zu einem späteren Zeitpunkt auch auf einer anderen Plattform laufen müsste und deshalb portabel sein sollte. Schließlich dominiert Windows nach wie vor die Welt der Betriebssysteme. Doch um sich neue Märkte zu eröffnen und größere Flexibilität zu schaffen, schlagen manche Unter- nehmen mittlerweile einen anderen Weg ein. Im Zentrum der Neuorientierung steht vielfach die Notwendigkeit, ein Softwarepaket für weitere Betriebssysteme bereitstellen zu können, um sich nicht komplett in die Abhängigkeit von Windows zu begeben.

Fazit

Im Bereich der Standardsoftware wächst die Plattformunabhängigkeit inzwischen zu einem zentralen Thema heran. In vielen Fällen erhöht gerade sie die Akzeptanz der Software, da Anwender ein vertrautes Programm auf verschiedenen Systemen verwenden können. Prominente Beispiele sind der Internet-Browser Firefox, das E-Mail-Programm Thunderbird, das Grafikprogramm Gimp sowie das Office-Paket Openoffice.

Ähnlich sieht es im Bereich Individualsoftware aus. Hier ist es wichtig, den Aufwand einer nachträglichen Portierung gering zu halten und bei Bedarf schnell auf die Wünsche der Anwender reagieren zu können. Das Problem, die im C++-Sprachumfang fehlenden Funktionen zur Darstellung der grafischen Steuerelemente, kann über den Zugriff auf systemabhängige Bibliotheken wie MFC oder OSF/Motif gelöst werden. Eine andere Möglichkeit ist zum Beispiel die Verwendung des Qt-Toolkits als Bibliothek mit plattformunabhängiger Schnittstelle.

Qt-Varianten

Bei Qt handelt es sich um eine Klassenbibliothek zur plattformübergreifenden Programmierung grafischer Benutzeroberflächen. Der Qt-Entwickler, die norwegische Firma Trolltech, stellt ein duales Lizenzsystem zur Verfügung:

• Die Open-Source-Edition steht unter der GNU General Public License (GPL) und kann kostenfrei unter www.trolltech.com heruntergeladen werden.

• Die kommerzielle Version steht unter einer kostenpflichtigen Lizenz, die einen Support seitens Trolltech beinhaltet.

Die kommerzielle Version wird nur benötigt, falls mit Qt Produkte entwickelt werden, die nicht unter einer freien Lizenz stehen. Der Funktionsumfang der Open-Source-Edition ist gegenüber der kommerziellen Version nur geringfügig eingeschränkt.

Zum Ausgleich der Betriebssystem-Unterschiede gibt es systemabhängige Qt-Bibliotheken. Hierzu zählen:

• Qt/X11 für Linux/Unix (unterstützt viele Derivate);

• Qt/Embedded (Qtopia) für Embedded Linux;

• Qt/Windows für Microsoft Windows;

• Qt/Mac für Apple Macintosh.

Während der Qt-gestützte Quellcode immer identisch ist, werden die Daten von der Qt-Library Betriebssystem-typisch gespeichert:

• Linux/Unix: QSetting speichert die Daten in den gewohnten Textdateien.

• Windows: QSetting speichert die Daten in der Registry.

• Mac OS X: QSetting verwendet die Carbon API für Settings, um die Daten zu speichern.

Portierungen mit C++ gestalten

Die Probleme sind dabei trotz unterschiedlicher Projekte meist ähnlich, egal ob es sich um Software zum Visualisieren von Vektordaten oder um ein Programm zur Bonitätsprüfung von Kunden für eine Bank handelt, das in den Filialen des Konzerns zum Einsatz kommen soll. In der Praxis erfreut sich die Programmiersprache C++ gerade in solchen Projekten großer Beliebtheit, weil sich in der Vergangenheit gezeigt hat, dass sie sich insbesondere für die Entwicklung umfangreicher und effizienter Anwendungen eignet.

Das Entwicklungsmodell sieht dabei häufig so aus, dass die Basis der Anwendung ein portabler Quellcode ist, der oft sogar über 99 Prozent der Anwendung ausmacht, denn die International Organization for Standardization (ISO) hat C++ normiert. Betriebssystem-, Compiler- und prozessorspezifische Unterschiede sind jedoch plattformabhängig zu implementieren. Wie aber ist vorzugehen, wenn man den Compiler nicht "überfordern" will?

Standard Template Library

Ein Weg besteht darin, dem Compiler den plattformabhängigen Quellcode durch bedingte Übersetzung mit Hilfe des Präprozessors vorzuenthalten. Kommt zusätzlich die Standard Template Library (STL) zum Einsatz, so stehen dem Entwickler neben effizienten Container-Klassen wie Vektoren, Listen, Maps oder Stacks auch Algorithmen wie Binärsuche, Sortieren oder Merging zur Verfügung. Hinzu kommen Iteratoren und Funktionsobjekte. Die STL erleichtert die tägliche Arbeit immens, da die Container-Klassen die Implementierung mehrfach verwendeter Datenstrukturen vereinfacht.

Bibliothek für grafische Elemente

Häufig wird man jedoch mit dem Problem konfrontiert, dass der C++-Sprachumfang keine Funktionen zum Darstellen der grafischen Steuerelemente enthält. Dann verwendet man meist systemabhängige Bibliotheken wie die Microsoft Foundation Classes (MFC) unter Windows oder OSF/Motif unter Unix. Der Grund dafür ist, dass die grafische Ausgabe der Betriebssysteme, insbesondere Unix/Linux, Windows und Mac auf unterschiedlichen Prinzipien basiert und eng an das Betriebssystem gekoppelt ist. Dies führt zu dem entscheidenden Nachteil, dass die Plattformunabhängigkeit des Quellcodes verloren geht, da die Syntax abhängig von der verwendeten Bibliothek ist. Dieses Problem lässt sich vermeiden, indem eine Bibliothek mit plattformunabhängiger Schnittstelle zur Darstellung der grafischen Steuerelemente zum Einsatz kommt. Eine Möglichkeit bietet hier Qt, weil es sich bei dem Toolkit um ein umfangreiches Framework zur Entwicklung portabler Software basierend auf C++ handelt.

Auch bei der Entwicklung mit Qt werden systemabhängige Bibliotheken verwendet, allerdings sind deren Quellcodes größtenteils plattformunabhängig implementiert. Der entscheidende Vorteil in diesem Szenario besteht darin, dass die Bibliothek eine Betriebssystem-unabhängige Schnittstelle zur Verfügung stellt. Damit bleibt die Syntax des Quellcodes bei der Verwendung der Qt-Bibliothek unverändert, was die Portabilität der Software erhält.

Das zahlt sich aus. Denn auf der Basis des portablen Quellcodes lassen sich dann Binärdateien für viele unterschiedliche Zielsysteme, die sich in Prozessor und Betriebssystem unterscheiden können, erzeugen. Dazu ist allerdings immer ein Compiler für das entsprechende Zielsystem erforderlich. Zwei Szenarien sind dabei denkbar:

1. Übersetzen der Sourcen auf dem Zielsystem;

2. Übersetzen der Sourcen durch einen Cross-Compiler für das Zielsystem.

Während der erste Ansatz häufig bei den typischen PC- Betriebssystemen verwendet wird, ist der zweite Ansatz ins- besondere für Embedded-Lösungen interessant, die oft nicht über genügend Ressourcen für das Entwicklungssystem verfügen.

Wenig vorausschauend

Der Mehraufwand für die Bereitstellung von Software für mehrere Betriebssysteme ist durch den plattformunabhängigen Quellcode relativ gering. Dennoch wird oft gerade dieser Aufwand gescheut und das Programm auf eine Windows-Version beschränkt, da die meisten Anwender ohnehin Windows verwenden. Der Rückgriff auf Qt, das in einem dualen Lizenzsystem zur Verfügung steht, lohnt sich dennoch. So bietet selbst die Open-Source-Version von Qt umfangreiche Funktionen in über 400 Klassen. Hierzu zählen unter anderem:

• Vektor- und Pixelgrafik: Gängige Grafikformate lassen sich lesen, darstellen, manipulieren und schreiben. Ferner unterstützt Qt Open GL und das SVG-Format.

• Internationalisierung: Der Qt Linguist unterstützt die Eingabe von Texten in unterschiedlichen Sprachen auf der Grundlage von i18n.

• GUI-Design: Qt bietet einen GUI-Designer, mit dem man das Oberflächenlayout per Drag and Drop erstellen kann. Für die dynamische Posi- tionierung der grafischen Steuerelemente stehen mehrere Layout-Manager zur Verfügung. Das Design der Steuerelemente lässt sich automatisch an das Design der gän-gigen Betriebssysteme anpassen. Eigene GUI-Themes können implementiert werden.

• Datenbankanbindung: Qt unterstützt mit Hilfe eines eigenen Moduls die nahtlose Anbindung an verschiedene Datenbanken.

• XML-Format: Qt verfügt durch ein eigenes Modul über Funktionen zum Lesen, Manipulieren und Schreiben von XML-Inhalten.

Neben der Standard-C++-Implementierung gibt es auch verschiedene Open-Source-Implementierungen der Qt-Bibliothek für weitere Sprachen (Python, Ruby, C, C#, Java und Perl). Eine Java-Implementierung der Qt-Bibliothek ist laut Hersteller kurz vor der Fertigstellung und wird bereits als Technology-Preview angeboten.

Damit bleibt nur noch ein wesentliches Problem, mit dem sich viele C-/C++-Entwickler ungern auseinandersetzen: die Erstellung der Makefiles. Diese unterscheiden sich je nach Compiler und Betriebssystem. Hier stellt das Framework "qmake" einen Generator zur Verfügung, der das plattformspezifische Makefile auf einer plattformunabhängigen Projektdatei mit der Endung .pro durch den Befehl qmake erzeugt. Die plattformunabhängige Projektdatei enthält lediglich die zur Erstellung des Makefiles erforderlichen Anweisungen.

Die letzten Hürden

Über diesen Weg sind alle kritischen Hindernisse aus dem Weg geräumt. Es verbleiben noch einige kleinere Probleme, die sich durch entsprechendes Know-how leicht umgehen lassen. Hierzu zählt zum Beispiel die Anpassung der Anwendung an typische Eigenschaften des Betriebssystems, etwa das Speichern persistenter Betriebssystem-unabhängiger Settings. Eine viel versprechende Lösung besteht darin, die Klasse QSetting, die das Speichern und Lesen unterschiedlicher Datentypen unterstützt, zu verwenden. Während der Qt-basierende Quellcode identisch ist, werden die Settings von der Qt-Library Betriebssystem-typisch gespeichert.

Manipulierte Verzeichnisnamen

Weitere minderschwere Fehlerquellen sind die Verzeichnisstruktur und die Pfadangaben, denn beide sind Betriebssystem-abhängig. Eine plattformunabhängige Schnittstelle bietet die Klasse Qdir, welche die Manipulation des Verzeichnisnamens unterstützt. Dies sorgt für den Ausgleich einiger Betriebssystem-spezifischer Unterschiede. Der Mehraufwand für die Erstellung des Frameworks ist somit verhältnismäßig gering. Komplett sparen kann man sich den Extraaufwand für das Erzeugen der Binärdateien sowie das Testen der Software auf unterschiedlichen Betriebssystemen. Trotzdem lässt sich das Produkt sehr schnell auf weiteren Plattformen kompilieren und anbieten. (ue)