Suchen

Komponenten

Multiplattform-Entwicklung mit dem Qt-Framework

Seite: 3/3

Firmen zum Thema

Multimedia-Inhalte und -Hardware

Verschiedene Qt-Stile: Die Fenster-Inhalte sind auf unterschiedliche Desktop-Oberflächen anpassbar
Verschiedene Qt-Stile: Die Fenster-Inhalte sind auf unterschiedliche Desktop-Oberflächen anpassbar
(Bild: Mixed Mode)

In einer Gegenüberstellung der QWidgets und der Unterstützung von Multimedia-Inhalten in Qt zeigt sich deutlich, wie unterschiedlich die Plattformunabhängigkeit umgesetzt werden kann. Während die grafischen Dialogelemente dies durch komplettes eigenes Zeichnen erreichen, werden nur Multimedia-Inhalte unterstützt, die durch die Plattform verarbeitet werden können. Unter Linux wird das Gstreamer-Backend verwendet, unter Windows gibt es das DirectShow-Backend. Sollen Inhalte auf beiden Plattformen laufen, müssen die verwendeten Codecs entsprechend gewählt oder zusätzlich installiert werden. Die Abhängigkeit von externen Implementationen dürfte in diesem Fall die Möglichkeiten bezüglich unterstützter Formate eher verbessert haben.

Natürlich kann man auch separate Bibliotheken zum Dekodieren auf beiden Plattformen nutzen. Für die Tonausgabe als rohen PCM-Stream stehen in der QtMultimedia-Bibliothek die passenden Klassen bereit. Leider variiert hier die Qualität der Implementation stark. Insbesondere unter Linux ist sie nicht ganz unproblematisch, wenn ALSA und PulseAudio gleichermaßen gut unterstützt werden sollen. Auch auf die Erkennung der Hardware-Möglichkeiten sollte man hier nicht explizit setzen, da etwa die Samplerate nur eine Auswahl üblicher Werte testet und nicht den kompletten Umfang der Hardware abdeckt. Dies schränkt jedoch die generelle Funktionalität nicht ein.

Möchte man nicht Medien abspielen, sondern Audio- oder Videodaten aufzeichnen, so ist auch das einfach machbar. Vorhandene Mikrofoneingänge oder Kameras können enumeriert werden und entsprechende Daten ausgelesen werden, um sie entweder direkt wieder auszugeben oder passend kodiert abzuspeichern. Wie beim Dekodieren von Inhalten ist man beim Encodieren von den verfügbaren Codecs im System abhängig oder nutzt zum Encodieren die passenden Bibliotheken.

Bilddateien sind deutlich einfacher zu integrieren. Alle wichtigen Formate wie BMP, JPG und PNG werden ohnehin direkt unterstützt. HTML-Inhalte können durch den integrierten Browser direkt verarbeitet werden. Die Technik dazu lieferte bis vor kurzem noch QtWebKit, während bei den neueren Qt5-Versionen QtWebKit von QtWebEngine abgelöst wurde. Es basiert auf Chromium, der OpenSource-Variante von Chrome. Beide Möglichkeiten unterscheiden sich leicht in der Handhabung, sollten aber die essentiellen Features bieten, insbesondere durch Manipulation von Elementattributen und Ausführung von JavaScript.

Auch die Ausgabe auf Druckern ist einfach. Vorhandene Drucker sind enumerierbar und die Ausgabe erfolgt wie auf anderen Widgets. Die Unterstützung für das Drucken (oder Erstellen) in eine PDF-Datei ist direkt integriert und kann auch programmintern wie ein Drucker angesprochen werden.

Oft möchte man in Programmen auch auf Dateien zugreifen. Auch dafür hält Qt Klassen bereit. Sie reichen von einfacher Verwaltung von Dateien und Verzeichnissen über ausgefeilte Abstraktionen als Input- oder Output-Stream und nutzen die auf der jeweiligen Plattform verfügbaren APIs. Man muss jedoch beachten, dass diese Implementationen in Qt teilweise stark abstrahiert sind und nicht immer alle Informationen der Plattform zur Verfügung stellen. So sind die Fehlercodes und Fehlertexte beim Zugriff auf Dateien nicht zugänglich und nur stark vereinfacht etwa durch QFile::FileErrors-Enum dargestellt. Es ist jedoch nicht schwierig, Alternativen in Form eigener Klassen zu entwickeln, die auf die eigenen Bedürfnisse besser zutreffen und trotzdem die Qt-I/O-Streams unterstützen, somit letztlich auch ins übrige Qt voll integrierbar sind.

Dateien und Input-/Output-Streams mit Qt nutzen

Qt stellt auch ein QFileSystem-Modell für die Ansicht von Dateibäumen bereit, das viele Prozessschritte in einen separaten Thread auslagert und es somit vermeidet, den GUI-Thread zu blockieren. Das ist für viele Anwendungszwecke ausreichend schnell. Bei Einsatzszenarien mit vielen Tausend Verzeichniseinträgen kann aber eine Alternative wünschenswert sein. Aktuell lässt es auch noch die Handhabung von Hotplugging-Unterstützung unter Windows vermissen, während dies unter Linux implizit durch das Beobachten von Verzeichnisänderungen gegeben ist.

Die Nutzung von Qt-I/O-Streams ist auch mit Netzwerkprotokollen möglich. Direkt unterstützt werden HTTP und FTP als High-Level-Protokolle. Hier ist jedoch nur die Funktionalität zur Handhabung des Inhalts von URLs enthalten. Insbesondere die Verwaltung von FTP-Verzeichnissen gibt es seit Qt5 nicht mehr direkt. Die Erweiterung um weitere Protokolle ist jedoch leicht möglich. Dazu kann man die vorhandenen Klassen für die Low-Level-Protokolle TCP und UDP für Server- und Client-Anwendungen verwenden, auch ohne den aktuellen Thread zu blockieren. Erfordert das Protokoll verschlüsselte Kommunikation mit TLS, so ist auch dies integrierbar.

Wenn man abseits von Netzwerkkommunikation schaut, so gibt es in Qt5 auch Klassen, mit denen serielle Ports angesprochen werden können oder der Bluetooth-Stack der Plattform genutzt werden kann. Der Windows-Bluetooth-Stack von Microsoft wird jedoch nicht unterstützt und die generelle Ausrichtung der Implementierung scheint in Richtung Mobile Devices zu gehen.

* Hendrik Sattler arbeitet bei Mixed Mode in Gräfelfing bei München. Er befasst sich mit Buildsystemen, Qt, Cross-Platform sowie Embedded-Themen.

Artikelfiles und Artikellinks

(ID:44363830)