Qt: Das C++-Framework

Wer Anwendungen entwickelt, weiß darum, wie komplex Kreation und Strukturierung der einzelnen Komponenten sind. Bibliotheken und Frameworks mit ihren einsatzfertigen Komponenten spielen deshalb eine wichtige Rolle. Diese helfen nicht nur bei der Vereinheitlichung des Entwicklungsprozesses, sondern vereinfachen diesen auch. Das plattformübergreifende Framework Qt beispielsweise nimmt Ihnen eine Menge Arbeit bei der Entwicklung grafischer Benutzeroberflächen und ganzer Programme ab, wobei insbesondere eine reibungslose Zusammenarbeit zwischen Designern und Entwicklern im Fokus steht. Hierfür sorgen Komponenten wie die integrierte Entwicklungsumgebung Qt Creator, eine eigene Auszeichnungssprache sowie diverse, frei wählbare Module.

Was ist Qt?

Weil sie unzufrieden mit den Tools zur plattformübergreifenden Software-Entwicklung waren, begannen die beiden Norweger Haavard Nord und Eirik Chambe-Eng 1990 mit der Entwicklung von Qt. Zwei Jahre später gründeten sie das Unternehmen Trolltech, das zwischenzeitlich vom Telekommunikationskonzern Nokia und 2012 von der finnischen Software-Firma Digia übernommen wurde. Seit 2014 ist das Digia-Tochterunternehmen The Qt Company für die Entwicklung zuständig.

Im Laufe der Jahre hat sich Qt dabei von einer einfachen Klassenbibliothek zu einem umfangreichen Framework entwickelt und zahlreiche Wechsel des Lizenzmodells hinter sich. Das heutige duale Lizenzsystem, das dem Nutzer die Wahl zwischen einer proprietären Lizenz und den Open-Source-Lizenzen GPL und LGPL lässt, macht sowohl die gemeinnützige als auch die kommerzielle Nutzung möglich.

Qt ist in C++ programmiert, wobei die Programmiersprache durch den Präprozessor MOC (Meta-Object Compiler) um Features wie den elementaren Signal- und Slot-Mechanismus (ermöglicht die ereignisgesteuerte Kommunikation zwischen Programmobjekten) erweitert wird. Hierfür generiert der Präprozessor noch vor der Kompilierung standardkonformes C++ aus dem Qt-Quellcode. In der Konsequenz können Qt-Anwendungen mit gängigen C++ Compilern wie GCC, ICC, MinGW oder MSVC übersetzt werden. Neuere Versionen des Frameworks bieten zudem Zugriff auf die Qt-eigene Auszeichnungssprache QML, die insbesondere bei der GUI-Entwicklung für Vereinfachungen sorgt. Abseits dieser internen Sprachlösungen gibt es verschiedene, von Drittanbietern bereitgestellte Anbindungen für andere Programmiersprachen wie Python, Ruby, Go, Java oder PHP.

Mit qmake (Standardlösung) und Qbs (Qt Build Suite) hält das Framework zwei eigene Build-Systeme bereit, wobei grundsätzlich auch andere Systeme wie CMake genutzt werden können. Zudem steht Nutzern die eigene integrierte Entwicklungsumgebung Qt Creator zur Verfügung, die u. a. über einen Code-Editor verfügt und einen Schnellzugriff auf die gewählten Komponenten ermöglicht.

Die wichtigsten Qt-Komponenten im Überblick

Mit der Zeit ist das Qt-Framework immer umfangreicher geworden. So wurde nicht nur intensiv an der Qualität der integrierten Entwicklungsumgebung Qt Creator sowie an der Sprach- und Plattformunterstützung gearbeitet, sondern auch daran, Programmierern und Designern eine möglichst breite Funktionspalette zur Verfügung zu stellen. Dabei legt das Qt-Team seit jeher Wert darauf, auch spezifische Anwendungsszenarien aus dem Desktop- wie aus dem Mobile-Sektor abzudecken.

Da nur die wenigsten Anwendungen auf Basis von Qt auf den kompletten Funktionsumfang angewiesen sind, ist das Framework seit Version 4 in Module gegliedert. Diese lassen sich frei auswählen und zusammensetzen, was sowohl dem Qt-Team als auch den Nutzern eine hohe Flexibilität bei der Entwicklung gewährt. Mit Version 5 hat das Qt-Team eine zusätzliche Unterscheidung der Module in Basismodule (Qt Essentials) und Zusatzmodule für spezielle Einsatzzwecke (Qt Add-ons) eingeführt.

Qt Essentials

Qt Essentials bilden plattformübergreifend die Basis von Qt. Sie sind auf allen unterstützten Entwicklungsplattformen ebenso wie auf allen getesteten Zielplattformen verfügbar und für einen Großteil der entwickelten Anwendungen relevant bzw. nützlich. Folgende Module zählen zu den essenziellen Komponenten des Frameworks:

Modul Beschreibung
Qt Core Nichtgrafische Kernklassen, die von allen anderen Modulen benötigt werden
Qt GUI Basisklassen zu Gestaltung grafischer Benutzeroberflächen; beinhaltet OpenGL
Qt Multimedia Set von QML-Typen und C++-Klassen für die Verarbeitung von Multimedia-Inhalten (Audio/Video); APIs für den Zugriff auf Kamera- und Radio-Funktionalität
Qt Multimedia Widgets Auf Widgets basierende Klassen zur Implementierung von Multimedia-Funktionalität
Qt Network APIs für Anwendungen, die auf TCP/IP-Netzwerke zurückgreifen
Qt QML Framework und Typen der Qt-Auszeichnungssprache QML
Qt Quick Deklaratives Framework für die Entwicklung hochdynamischer Anwendungen mit maßgeschneiderten QML-Bedienoberflächen
Qt Quick Controls 2 Qt-Quick-Erweiterung: leichtgewichtige, sehr effiziente QML-Typen, die die Interface-Erstellung vereinfachen
Qt Quick Dialogs Qt-Quick-Erweiterung: Typen für die Kreation und Interaktion mit Systemdialogen
Qt Quick Layouts Qt-Quick-Erweiterung: QML-Typen für die Anordnung von Objekten im entwickelten Interface
Qt Quick Test Test-Framework für QML-Applikationen; die Testfälle sind als JavaScript-Funktionen beschrieben
Qt SQL Klassen für die Integration von SQL-Datenbanken
Qt Test Klassen für detaillierte Tests von Qt-Applikationen und -Bibliotheken
Qt Widgets Set von UI-Elementen zum Kreieren klassischer, auf Widgets basierender Benutzeroberflächen mit dem Qt Designer

Welche Module zum Einsatz kommen, unterscheidet sich wie erwähnt von Anwendung zu Anwendung. Entscheidend sind dabei in erster Linie die Anforderungen, die das jeweilige Projekt erfüllen muss. In einigen Fällen ist es aber auch maßgeblich, mit welchen Tools Sie arbeiten wollen: So sind die Module Qt Core und Qt GUI standardmäßig eingebunden, wenn Sie mit qmake arbeiten wollen. Wählen Sie Qbs oder eine andere Lösung als Build-System, existiert es eine solche vordefinierte Abhängigkeit nicht.

Bei der Gestaltung grafischer Benutzeroberflächen bietet Qt ebenfalls zwei unterschiedliche Möglichkeiten, die die Wahl der Kernmodule beeinflussen: Einerseits steht mit dem Qt Designer ein WYSIWYG-Editor zur Verfügung, der eng an die Qt Widgets geknüpft ist. Andererseits ist mit Qt Quick eine Alternative (inklusive verschiedener erweiternder Module) auswählbar, die die Entwicklung mit der QML-Sprache ermöglicht.

Qt Add-ons

Mit dem Label „Qt Add-ons“ werden alle Module versehen, die den Nutzern von Qt einen zusätzlichen Nutzen für spezifische Zwecke bringen. Während einige dieser Zusatzmodule wie die Kernmodule für alle unterstützten Entwicklungs- und Zielplattformen konzipiert sind, ist ein Großteil dieser Komponenten nur auf bestimmten Plattformen einsetzbar. So funktioniert das Add-on Qt Bluetooth, das Zugriff auf Bluetooth-Hardware gewährt, beispielsweise nur in Android-, iOS-, Linux- und macOS-Anwendungen; Module wie Qt Windows Extras, Qt Mac Extras oder Qt Android Extras arbeiten nur in Programmen für die entsprechenden Zielplattformen.

Zudem gibt es drei Add-ons, die lediglich unter der kommerziellen Lizenz oder unter der GNU-GPLv3-Lizenz verfügbar sind:

  • Qt Charts: UI-Komponenten zur Anzeige optisch ansprechender Diagramme (basierend auf statischen oder dynamischen Datenmodellen)
  • Qt Data Visualization: UI-Komponenten für die 3D-Visualisierung von Daten
  • Qt Virtual Keyboard: Framework zur Implementierung verschiedener Eingabemethoden sowie virtueller Tastaturen auf QML-Basis (Zielplattformen: Linux, Windows)
Hinweis

Seit Qt 5 existieren spezielle Zusatzmodule („Value-Add Modules“), die ausschließlich unter Verwendung der kommerziellen Lizenz verfügbar sind. Dazu zählt beispielsweise das Modul Qt for Automation, das verschiedene Bibliotheken und Tools zur Entwicklung von Automatisierungssystemen wie KNX (Gebäudeautomatisierung) enthält.

Qt Creator

Die integrierte Entwicklungsumgebung (IDE) Qt Creator versorgt Sie während des gesamten Entwicklungsprozesses mit zahlreichen Tools und Automatisierungsmechanismen. So hilft ein Einrichtungsmanager bei der Kreation eines neuen Projekts, indem er Sie Schritt für Schritt durch den Erstellungsprozess führt und automatisch alle notwendigen Dateien anlegt. Zudem beschleunigt die IDE das Code-Schreiben. Hierfür bietet der integrierte Editor u. a. Features wie Syntaxhervorhebung, automatische Code-Vervollständigung oder Fehlerüberprüfung.

Hinweis

Binärpakete für die Installation von Qt Creator (im Download von Qt enthalten) sind für die Betriebssysteme Windows (ab 7), Ubuntu Linux (ab 16.04) und macOS (ab 10.10) verfügbar.

Folgende Tools sind zusätzlich zum Code-Editor standardmäßig in Qt Creator integriert:

  • qmake: Als Standard-Build-System von Qt ist qmake direkt in Qt Creator integriert und im Projektmenü auswählbar. Andere Systeme lassen sich aber auch in der IDE ausführen. Um Qbs zu nutzen, öffnen Sie beispielsweise einfach eine .qbs-Datei.
  • Qt Designer: Der Qt Designer ist das native Programm zum Designen und Erstellen grafischer Benutzeroberflächen mithilfe von Qt Widgets. Der visuelle Editor erlaubt es, die Widgets beliebig zusammenzustellen und anzupassen.
  • Qt Linguist: Anwendungen können direkt in Qt Creator sprachlich lokalisiert werden. Entwickler, Übersetzer und Release-Manager finden hierzu die jeweils passenden Werkzeuge vor.
  • Qt Assistant: Mit Qt Assistant liefert Qt Creator einen schnellen Zugang zur offiziellen Dokumentation des Frameworks. Hierfür gibt es eine Hilfsfunktion.

So funktioniert die Software-Entwicklung mit Signalen und Slots in Qt

Dank der Anbindungen an Python, Ruby, Go usw. unterstützt Qt grundsätzlich diverse Sprachen. Die native Programmiersprache des Frameworks bleibt aber in jedem Fall C++, wobei die Erweiterung dieser objektorientierten Sprache durch den MOC-Präprozessor für einige neue Aspekte und Paradigmen wie die bereits genannten Signale und Slots sorgt. Das Konzept ermöglicht eine ereignisgesteuerte Kommunikation zwischen verwendeten Programmkomponenten und stellt eine flexible Alternative zu direkten Rückruf-Funktionen (Callbacks) dar. So ermöglicht es beispielweise die Verknüpfung von Objekten oder Modulen, ohne dass sich diese zwangsläufig kennen müssen.

Hinweis

Qt ist der Urheber des Signal-Slot-Konzepts und hat dieses im Laufe der Jahre entscheidend geprägt. Mittlerweile greifen aber auch viele andere Programmbibliotheken und Frameworks wie Flow auf das Verknüpfungsmodell zurück.

Konkret handelt es sich bei einem Signal um eine Nachricht, die ein Objekt sendet, sobald ein bestimmtes Ereignis eintritt. Ein Slot wiederum ist eine gewöhnliche Funktion, die mit einem Signal verknüpft werden kann, um in der Folge immer dann ausgeführt zu werden, wenn sie das Signal erhält. Es ist möglich, ein Signal mit mehreren Slots zu verknüpfen, sodass mehrere Funktionen als Resultat eines einzelnen Ereignisses aufgerufen werden. Ebenso lässt das Programmierungskonzept die Verknüpfung mehrerer Signale mit einem einzelnen Slot zu. In diesem Fall wird ein und dieselbe Funktion beim Auftreten unterschiedlicher Ereignisse aufgerufen.

Die Signale und Slots helfen dabei, eine ereignisorientierte Funktionalität in die Benutzeroberfläche der entwickelten Anwendung zu bringen. In Qt müssen Sie die Signal-Slot-Verknüpfungen allerdings nicht mühsam und einzeln per Hand anlegen – viele der mitgelieferten Klassen des Frameworks bieten Zugriff auf diverse vordefinierte Signale und Slots. Sie können bei Bedarf aber auch eigene Objekt-Verbindungen erstellen.

Was kann die Qt-eigene Auszeichnungssprache QML?

Seit Version 4.7 ist Qt mit der hauseigenen Auszeichnungssprache QML ausgestattet. Diese zeichnet sich u. a. dadurch aus, dass sie eine JSON-ähnliche Syntax hat und imperative JavaScript-Ausdrücke unterstützt. Im Zentrum steht allerdings die deklarative Beschreibung der GUI-Elemente, die für einen übersichtlichen Programmcode sorgt. QML vereint also deklarative und imperative Ansätze in einer einzelnen Programmiersprache, was dem Entwickler eine Menge Spielraum gewährt. Haben Sie das Modul Qt Quick ausgewählt, haben Sie mit dem Qt Quick Compiler das passende Werkzeug für die Kompilierung des QML-Codes in natives C++ parat. Außerdem können Sie den gleichnamigen Designer (Qt Quick Designer) in Qt Creator nutzen, um mit vorgefertigten QML-Komponenten zu arbeiten.

QML offenbart seine Stärken insbesondere bei der GUI-Entwicklung: Aufgrund der wesentlich einfacheren Syntax und der Unterstützung von JavaScript bietet sie Designern einen deutlich besseren Zugang als C++. So lassen sich z. B. problemlos in JSON verfasste Benutzeroberflächen durch Export aus Photoshop erstellen, was den Entwicklungsprozess erheblich beschleunigt. Auch wenn es theoretisch möglich ist, das gesamte Programm in QML zu schreiben, kommt die Auszeichnungssprache beim Programmieren der Anwendungslogik eher selten zum Einsatz.

Hinweis

QML hat die UI-Erstellung via Widgets in vielerlei Hinsicht überflüssig gemacht. Insbesondere, wenn es um Animationen und komplett benutzerspezifische Layouts und Kontrollkomponenten (Mobile, Touchscreen etc.) geht, spielt die Auszeichnungssprache ihre Stärken aus. Geht es allerdings um traditionelle Desktop-Bedienelemente wie Menüleisten, Symbolleisten oder Drag-and-Drop-Komponenten, bieten Widgets eine bessere Unterstützung, weshalb ihre Nutzung in klassischen Desktop-Umgebungen immer noch weit verbreitet ist.

Auf welchen Plattformen läuft Qt?

Qt wird von diversen 32- und 64-Bit-Plattformen unterstützt. Zur Nutzung des Frameworks ist in der Regel nicht mehr als GCC oder ein anderer Compiler nötig. Für die Verwendung von Qt Quick wird darüber hinaus Open GL, DirectX oder ein alternativer Renderer gebraucht. Das Entwicklerteam listet für die aktuelle Qt-Version folgende offiziell unterstützten Plattformen auf:

Plattform Version Compiler
Windows 10, 8.1, 7, UWP (Universal Windows Platform) MSVC 2017, MSVC 2015, MinGW 5.3
Linux/X11 openSUSE 42.2, Red Hat Enterprise Linux 6.6 und 7.2, Ubuntu 16.04 GCC (ab 4.8), ICC
Android ab 4.1 GCC, MinGW 5.3
macOS etc. macOS (ab 10.11), iOS 10 und 11, tvOS 10 und 11, watchOS 3 und 4 Clang (Apple)
Eingebettete Systeme Embedded Linux, Embedded Linux (Boot2Qt), QNX 6.6.0 und 7.0, INTEGRITY 11.4.4 GCC

Wo kommt Qt zum Einsatz?

Das wohl größte bekannte Software-Projekt, in dem das Qt-Framework zum Einsatz kommt, ist KDE Plasma (vormals KDE Plasma Workspaces). Dabei handelt es sich um eine Reihe von Desktop-Umgebungen bzw. seit Version 5 eine einzelne flexible Umgebung der Open-Source-Community KDE für verschiedene Geräte (Desktop, Notebook, Netbook, Tablet, Smartphone). Layouts und Kontrollelemente sind dabei in den verschiedenen Desktop-Varianten dank Qt perfekt auf die Anforderungen der jeweiligen Geräte zugeschnitten.

Weitere prominente Beispiele für Software auf Basis von Qt zeigen, wie vielseitig die Anwendungsszenarien des Frameworks sind:

Multimedia:

  • das Bildbearbeitungsprogramm Adobe Photoshop Elements
  • das Bildverwaltungsprogramm Adobe Photoshop Album
  • der freie Multimedia-Player VLC Media Player
  • die Linux-App des Musikstreaming-Dienstes Spotify

Kommunikation:

  • die Linux-Edition des Kommunikations-Tools Skype
  • der Instant-Messaging-Dienst Telegram
  • die Sprachkonferenz-Software TeamSpeak

Filesharing:

  • der P2P-Client Marabunta
  • der KDE-Download-Manager KGet
  • der BitTorrent-Client Transmission

3D-Grafik-Tools:

  • die 3D-Modellierungssoftware Adobe Muse CC
  • die 3D-Virtualisierungssoftware Autodesk Maya
  • die CAD-Software AutoQ3D

Spiele:

  • Monkey Island
  • Dust Racing 2D

Sonstige:

  • das Layout-Programm Scribus
  • die Mathematik-Software Mathematica
  • die Notations- und Kompositionssoftware Sibelius

Fazit: Flexibles Framework für vielfältige Cross-Plattform-Projekte

Qt ist ein Framework-Urgestein, das sich stets den Anforderungen moderner GUIs angepasst hat. Nicht von ungefähr zählt die in C++ geschriebene Tool-Sammlung auch über zwei Jahrzehnte nach Release der ersten Version zu den beliebtesten Lösungen für die plattformunabhängige Entwicklung grafischer Benutzeroberflächen. Hierfür sorgen insbesondere Tools wie der Qt Creator oder die in neueren Versionen implementierte Auszeichnungssprache QML, die nicht nur den Arbeitsprozess im Allgemeinen optimieren, sondern auch die Zusammenarbeit zwischen Designern und Programmierern vereinfachen.

War dieser Artikel hilfreich?
Page top