Qt (Bibliothek)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Qt
Qt-Logo
Entwickler The Qt Company
Erscheinungsjahr 20. Mai 1995
Aktuelle Version 5.5
(1. Juli 2015)
Betriebssystem Unixartige mit X11, Linux mit Wayland[1], Windows, Windows RT, Windows CE, Symbian OS (bis Qt 4.8[2][3]), Android, SailfishOS, Mac OS X, iOS, QNX/BlackBerry 10 [4]
Programmier­sprache C++
Kategorie Klassenbibliothek
Lizenz Duales Lizenzsystem Proprietär und GPL Version 3, LGPL Version 2.1[5], LGPL Version 3[6]
Deutschsprachig ja
qt.io

Qt (lies englisch cute[7] [kjuːt]) ist eine C++-Klassenbibliothek für die plattformübergreifende Programmierung grafischer Benutzeroberflächen. Außerdem bietet Qt umfangreiche Funktionen zur Internationalisierung sowie Datenbankfunktionen und XML-Unterstützung an und ist für eine große Zahl an Betriebssystemen bzw. Grafikplattformen, wie X11 (Unix-Derivate), Mac OS X, Windows, iOS und Android erhältlich. Qt wird insbesondere in den Bibliotheken der KDE Software Compilation 4 verwendet, welche gleichzeitig das prominenteste Vorzeigebeispiel der Klassenbibliothek darstellt.

Die Klassenbibliothek steht unter einer proprietären Lizenz, unter der GNU General Public License (GPL) und seit Version 4.5 zusätzlich unter der GNU Lesser General Public License (LGPL) zur Verfügung (siehe Duales Lizenzsystem).

Qt verwendet einen Präprozessor, genannt MOC (meta object compiler), womit C++ um Fähigkeiten bereichert wird, die im Sprachstandard nicht enthalten sind, beispielsweise Signale und Slots sowie Introspektion. Der so erzeugte Code folgt dem C++-Standard, so dass er mit handelsüblichen Compilern übersetzt werden kann. Es gibt auch Anbindungen für andere Programmiersprachen, die größtenteils von der Community bzw. von Drittanbietern zur Verfügung gestellt werden, unter anderem für Python (PyQt, PySide), Ruby (QtRuby), C# (Qyoto-Projekt, QtSharp), Java (Qt Jambi), PHP (PHP-Qt), D (QtD), Haskell (qtHaskell), Perl (PerlQt), Pascal (Qt4Pas) und Ada (QtAda).

Geschichte[Bearbeiten]

Anfänge und Namensentwicklung[Bearbeiten]

Haavard Nord und Eirik Chambe-Eng begannen mit der Entwicklung von Qt im Jahre 1991. Drei Jahre später gründeten sie das Unternehmen Quasar Technologies, welches später in Trolltech umbenannt wurde.

Der Name Qt stammt daher, dass das Q nach Haavard Nords Geschmack besonders schön in seinem Emacs anzusehen war und das t an Xt (das X-Toolkit) erinnerte.[8] Ausgesprochen wird Qt offiziell wie das englische Wort cute.[7] Dieses Wort soll die Ansicht der Entwickler ausdrücken, dass der Quelltext und die API von Qt eben cute seien, was auf Deutsch unter anderem so viel wie süß, hübsch usw., aber auch pfiffig heißt.

Datum Version
10. Juli 1998 1.40
2. Oktober 1998 1.41
19. Dezember 1998 1.42
13. März 1999 1.44
26. Juni 1999 2.0
13. April 2000 2.1
7. Dezember 2000 2.2
8. März 2001 2.3
16. Oktober 2001 3
14. November 2001 3.1
24. Juli 2003 3.2
5. Februar 2004 3.3
29. Juni 2005 4
20. Dezember 2005 4.1
4. Oktober 2006 4.2
30. Mai 2007 4.3
6. Mai 2008 4.4
3. März 2009 4.5
1. Dezember 2009 4.6
21. September 2010 4.7
15. Dezember 2011 4.8
28. März 2012 4.8.1
22. Mai 2012 4.8.2
13. September 2012 4.8.3
29. November 2012 4.8.4
2. Juli 2013 4.8.5
24. April 2014 4.8.6
19. Dezember 2012 5.0
3. Juli 2013 5.1
12. Dezember 2013 5.2
20. Mai 2014 5.3
25. Juni 2014 5.3.1
16. September 2014 5.3.2
10. Dezember 2014 5.4
24. Februar 2015 5.4.1
1. Juli 2015 5.5

Übernahmen durch Nokia und Digia[Bearbeiten]

Anfang 2008 wurde Trolltech von Nokia für 150 Mio. US-Dollar aufgekauft[9] und die Entwicklung in der Sparte Qt Development Frameworks fortgeführt. Im Jahre 2011 hat Nokia das Projekt unter dem Namen Qt-Project als freie Software in die Hände der Open-Source-Community gegeben[10] und das Geschäft mit der kommerziellen Lizenzierung und die Serviceverträge für eine unbekannte Summe an Digia verkauft.[11] Im August 2012 wurden auch die restlichen Teile, wie das Servergeschäft und die Entwicklungsabteilung, für 4 Mio. €[9] an Digia abgegeben.[12] Im August 2014 lagerte Digia die Entwicklung von Qt in ein Tochterunternehmen namens The Qt Company aus, um die bis dahin getrennt stattfindende Entwicklung der Open Source Edition und den kommerziellen Editionen wieder zu vereinen.[13]

Lizenzierung[Bearbeiten]

Kontroverse Auseinandersetzungen entstanden um das Jahr 1998, als sich abzeichnete, dass KDE sich als Standard-Desktop unter Linux durchsetzen würde. Da KDE zum großen Teil auf Qt basiert, machte sich ein großer Teil der Open-Source- und freie Software-Gemeinde Sorgen, dass ein so wichtiger Teil des Systems unter kommerzieller Kontrolle stand. Das führte zu zwei Entwicklungen: Erstens wurde das Harmony-Toolkit entwickelt, das die Funktionen von Qt exakt kopieren, jedoch unter einer Freie-Software-Lizenz stehen sollte. Zweitens begann die Arbeit an der Desktop-Umgebung Gnome, die ähnliche Funktionen wie KDE bieten sollte, allerdings das freie, in C geschriebene Toolkit GTK+ verwendet.

Bis Version 1.45 verwendete Trolltech die FreeQt-License für Qt. Diese war weder eine Open-Source- noch eine freie Lizenz. Es war zwar erlaubt, den Quellcode einzusehen, modifizierte Versionen durften allerdings nicht veröffentlicht werden. Mit dem Erscheinen von Version 2.0 wechselte Trolltech zur Q Public License (QPL), einer Open-Source-Lizenz, die aber von der Free Software Foundation als inkompatibel zur GPL eingestuft wurde. Darauf (im Jahre 1998) wurde die KDE Free Qt Foundation ins Leben gerufen, um zu verhindern, dass Qt im Falle einer Insolvenz oder Übernahme von Trolltech unter eine restriktivere Lizenz als die QPL fiele. Sie besteht aus jeweils zwei Vertretern von Trolltech und dem KDE e. V., wobei letztere im Zweifelsfall bei Abstimmungen die Mehrheit haben. Falls Trolltech länger als zwölf Monate keine Aktualisierungen (Updates) unter einer Open-Source-Lizenz liefern sollte, ist die „KDE Free Qt Foundation“ berechtigt, die letzte freie Qt-Version unter der BSD-Lizenz freizugeben.[14]

Als der Druck auf Trolltech größer wurde und das Debian-Projekt sich wegen Lizenzproblemen weigerte, KDE zu vertreiben,[15] änderte Trolltech im Jahre 2000 die Lizenz für die Linux-Variante des Toolkits. Seit Version 2.2 gab es fortan die Linux-Variante unter zwei Lizenzen: der GPL und der QPL (siehe Duales Lizenzsystem).

Die Windows-Variante war jedoch nach wie vor ausschließlich unter einer kommerziellen Lizenz verfügbar. Auch die gegen Ende des Jahres 2001 veröffentlichte Mac-OS-X-Variante war nur unter einer kommerziellen Lizenz erhältlich, bis im Juni 2003 Trolltech die Version 3.2 der Mac-OS-X-Variante auch unter die GPL stellte. Im Februar 2005 kündigte Trolltech schließlich an, Qt ab der Version 4.0 auch für die Windows-Plattform unter die GPL stellen zu wollen.[16] Das bestätigte sich, als im Juni 2005 Trolltech ein einheitliches duales Lizenzsystem für alle unterstützten Plattformen veröffentlichte. Heute gibt es für jede Plattform proprietäre und Open-Source-Edition (GPL-Edition).

Seit der Version 4.3.1 vom 9. August 2007 räumt Trolltech Ausnahmen bei der durch die GPL lizenzierten Open-Source-Version ein, die es ermöglicht, Programme, die Qt benutzen, unter einer nicht-GPL-kompatiblen Lizenz zu veröffentlichen. Die akzeptierten Lizenzen sind namentlich in einer separaten Liste aufgeführt. Weiterhin muss der Quellcode des Programms des Unternehmens Trolltech im selben Ausmaß zugänglich gemacht werden, wie er auch anderen Benutzern zur Verfügung steht, und die Rechte des Autors, Diskussionen über das Programm zu führen und den Quellcode für jeden zugänglich zu machen, dürfen nicht durch jegliche Rechtsmittel (wie beispielsweise besondere Verträge) beschnitten werden.[17][18]

Seit Anfang 2008 werden die Versionen von Qt auch unter der dritten Version der GPL veröffentlicht.[19]

Im März wurde Qt in Version 4.5 erstmals unter der LGPL veröffentlicht.[20] Durch die LGPL ist es möglich, auch ohne eine kostenpflichtige Lizenz proprietäre Software mit Qt zu entwickeln, ohne den Quellcode veröffentlichen zu müssen. Lediglich bei Änderungen am Quellcode von Qt selbst müssen diese Änderungen als Quellcode veröffentlicht werden. Darüber hinaus sind die lizenzbedingten Einschränkungen zu beachten. So darf beispielsweise nur unter strengen Bedingungen statisch gelinkt werden. Auch muss das Framework in unveränderter Form verwendet werden.[21]

Seit September 2014 wurde eine kostengünstige Edition von Qt namens Indie Mobile angeboten, die es erlaubte, mit Qt erstellte mobile Anwendungen in Verkaufsportalen wie Google Play und Apples App Store zu vertreiben, was aufgrund technischer Einschränkungen und den Nutzungsbedingungen der Verkaufsportale häufig nicht unter den Bedingungen der LGPL möglich ist. Der Quellcode durfte im Gegensatz zu den teureren kommerziellen Editionen aber nur in unveränderter Forum verwendet werden.[22] Mit dem Erscheinen von Qt 5.5 im Juli 2015 wurde die Indie Mobile Edition jedoch eingestellt.[23]

Änderungshistorie[Bearbeiten]

Qt 4[Bearbeiten]

Mit Qt 4.0 vom 28. Juni 2005 hat Trolltech fünf neue Techniken eingeführt:

  • Tulip – Ein Satz neuer Container-Klassen
  • Interview – Eine MVC-Architektur für elementbasierte Ansichten
  • Arthur – Ein neues 2D-Zeichenframework
  • ScribeUnicode-Textausgabe mit öffentlicher API zur Unterstützung von einfachen Textlayouts
  • MainWindow – Eine modernere Hauptfenster-Architektur, die Symbolleisten, Menüs und andockbare Fenster ermöglicht

Qt 4.1 wurde am 19. Dezember 2005 veröffentlicht und brachte SVG-Tiny-Unterstützung, ein PDF-Backend zum Qt-Drucksystem, und weitere Erweiterungen und Verbesserungen.[24]

Qt 4.2 erschien am 4. Oktober 2006 und brachte native CSS-Unterstützung zum Gestalten von Widgets. Auch wurden die QCanvas-Klassen von Qt 3.x zur Darstellung von zweidimensionalen Grafikobjekten durch ein Framework namens QGraphicsView zum Rendern von Grafikobjekten auf dem Bildschirm ersetzt.[25]

Seit dem 30. Mai 2007 steht Version 4.3 zur Verfügung. Sie brachte erweiterte Windows-Vista-Unterstützung, eine verbesserte OpenGL-Engine, sowie die Möglichkeit, SVG-Dateien zu erzeugen. Außerdem wurden eine ECMAScript-Engine namens QtScript und die Unterstützung von SSL-Verbindungen hinzugefügt.[26]

Qt 4.4 wurde am 6. Mai 2008 veröffentlicht.[27] Sie enthält erstmals Unterstützung für Windows CE, verwendet WebKit als HTML-Rendering-Engine und eine verbesserte API zur Programmierung von Anwendungen mit mehreren Threads.

Seit dem 3. März 2009 gibt es mit Qt 4.5 die neue Entwicklungsumgebung Qt Creator, womit Anwendungen für Linux, Mac OS X und Windows ohne zusätzliche Entwicklungswerkzeuge erzeugt werden können.[28]

Am 1. Dezember 2009 wurde Qt in der Version 4.6 veröffentlicht, welche nun auch Multi-Touch und die Plattformen Symbian OS und MeeGo unterstützt.[29]

Seit dem 21. September 2010 ist die Version 4.7 verfügbar. Mit dieser Version hält die deklarative Qt Meta Language oder Qt Modeling Language (QML) Einzug in die Bibliothek.[30]

Am 15. Dezember 2011 wurde Qt in der Version 4.8 veröffentlicht. Die neue Version bietet die Qt Platform Abstraction, Thread-Unterstützung für OpenGL und Multithread-Unterstützung für HTTP sowie einen optimierten Dateisystemzugriff.[31]

Qt 5[Bearbeiten]

Qt 5.0 wurde am 19. Dezember 2012 veröffentlicht. Die neue Hauptversion bringt u. a. einen OpenGL-basierten Szenengraphen, der das Zeichnen von Oberflächen, die in Qts eigener Programmiersprache QML – auch Qt Meta Language oder Qt Modeling Language genannt – geschrieben sind, beschleunigen soll. Zudem wurde QtQuick um neue Möglichkeiten für grafische Effekte auf Basis von OpenGL sowie ein Canvas-basiertes System zum imperativen Zeichnen in QtQuick erweitert. Für Linux bietet Qt 5 neben dem X Window System auch Unterstützung für das neuere Wayland. Weiterhin bietet die neue Version Funktionen zum Umgang mit JSON und bessere Unterstützung für IPv6. Die in Qt integrierte Web-Rendering-Engine QtWebkit soll nun volle Unterstützung für HTML5 haben. Die wohl wichtigste Änderung ist jedoch die weitere Modularisierung der Bibliothek, die einfachere Handhabung des Codes ermöglichen und einen geringeren Speicherverbrauch für Anwendungen bringen soll, die nur spezielle Teile der Bibliothek verwenden. Vor allem die weitere Modularisierung hat zur Folge, dass Qt 5.0 nicht ABI- und nicht API-kompatibel zu Qt 4.8 ist. Es wurde jedoch versucht, eine möglichst weitreichende API-Kompatibilität zu erreichen, der Sprung von Qt 4 auf Qt 5 stellt also keinen so starken Bruch dar wie der Versionssprung 3 auf 4.[32]

Qt 5.1 wurde am 3. Juli 2013 präsentiert. Gegenüber der alten Version sind 3000 Verbesserungen eingeflossen, außerdem gibt es eine vorläufige iOS- und Android-Unterstützung.[33] Deren vollständige Unterstützung wurde in Qt 5.2 fertiggestellt. Qt 5.3 erhielt eine experimentelle Unterstützung für WinRT.

In Version 5.4 wurde das Modul Qt WebEngine basierend auf Chromium zur Darstellung von Webseiten hinzugefügt, welches das dazu bisher vorhandene Modul Qt Webkit auf Basis der WebKit-Engine ablösen soll. Bis mindestens Qt 6.0 sollen jedoch noch beide Engines parallel unterstützt werden.[34] Darüber hinaus wird WinRT seit dieser Version vollständig unterstützt.[35]

Aktuell ist Version 5.5, in der die Aufteilung der Editionen überarbeitet wurde.[36]

Unterstützte Plattformen[Bearbeiten]

Es gibt derzeit folgende Varianten des Qt Frameworks:[4]

  • Qt for Linux/X11 – Qt für das X Window System, das unter Unix und Unix-Derivaten wie GNU/Linux, AIX, HP-UX und Solaris läuft.
  • Qt for Linux/Wayland – Qt für den Display-Server Wayland unter Linux.[1]
  • Qt for Windows – Qt für Microsoft Windows (XP und neuere). Es stehen 32 und 64bit Versionen für den Microsoft Visual Studio C++ Compiler bereit. Die MinGW-Variante steht nach wie vor nur als 32bit Version bereit.
  • Qt for Windows RT – Seit Qt 5.3 wird ebenso Windows RT, einschließlich Windows Phone, unterstützt.
  • Qt for OS X/Cocoa – Qt für Apples Mac OS X-Desktop-Betriebssystem und das Cocoa-Framework. Vollständig unterstützt wird OS X ab Version 10.7. OS X 10.6 wird mit Einschränkungen unterstützt.
  • Qt for embedded Linux (ehemals Qtopia Core, ehemals Qt/Embedded) – Mit Qt/Embedded stellte Trolltech eine Variante vor, die den Linux-Framebuffer statt des X-Window-Systems benutzt. Diese wird vor allem in eingebetteten Geräten auf Linux-Basis eingesetzt, zum Beispiel auf PDAs, Smartphones und Embedded Linux.
  • Qt for Windows CE – Qt für Windows CE und Windows Mobile
  • Qt for iOS – Qt für Apples mobiles Betriebssystem iOS (seit Qt 5.2)
  • Qt for Android – Qt für Android (seit Qt 5.2)
  • Qt for Sailfish OS – Qt für Jollas mobiles Betriebssystem Sailfish OS
  • Qt for QNX / BlackBerry 10 – Qt für das Echtzeitbetriebssystem QNX sowie für Blackberry 10, welches auf QNX basiert.
  • In der kommerziellen Enterprise-Edition werden zusätzlich die Echtzeitbetriebssysteme VxWorks und Integrity unterstützt.[37]

Mit neueren Versionen von Qt wurde der Support für manche Plattformen eingestellt. Dazu gehören:

  • Qt for the Symbian platform – Mit Qt 5 wurde die Unterstützung von Nokias Symbian-Smartphone-Betriebssystem eingestellt.[3]
  • Qt for OS X/Carbon – Das Carbon-Framework von Mac OS X wird seit Qt 5 nicht mehr unterstützt.
  • Qt for Maemo – Qt für Nokias Maemo-Smartphone-Betriebssystem (seit Qt 5 nur noch inoffiziell)[38]
  • Neben dem Qt Toolkit existierte noch Qt Extended (ehemals Qtopia), eine PDA- und Smartphone-Plattform basierend auf Qt/Embedded. Bekannt wurde sie vor allem durch den Zaurus-PDA von Sharp. Die Entwicklung wurde jedoch am 3. März 2009 eingestellt, um nicht neben Qt eine parallele Entwicklung zu betreiben.[39]

Externe Portierungen[Bearbeiten]

Nachdem Nokia den Qt-Quellcode veröffentlicht hat, sind noch verschiedene Portierungen für folgende Plattformen entstanden, die teilweise noch sehr experimentell sind: OpenSolaris[40], Haiku[41], OS/2 eCS platform[42], AmigaOS 4[43], HP webOS (Palm Pre)[44][45], Amazon Kindle DX.[46]

Editionen[Bearbeiten]

Derzeit gibt es die Editionen Qt Open Source, Qt for Application Development und Qt for Device Creation. Die Qt Open Source Edition kann kostenlos unter den Bedingungen der GPL- oder LGPL auch für kommerzielle Zwecke genutzt werden. Für die Nutzung der restlichen Editionen fallen monatliche Gebühren an, dafür werden Käufer dieser Editionen weitere Freiheiten eingeräumt. So können Änderungen an Qt vorgenommen werden, ohne dass diese veröffentlicht werden müssen. Darüber hinaus enthalten die kommerziellen Editionen offizielle Produktunterstützung seitens des Herstellers von Qt.[37]

Bis einschließlich Version 4.4 wurde zwischen den Versionen Qt Console (für die Entwicklung von Programmen ohne GUI), Qt Desktop Light (es fehlen Netzwerk-, Datenbank- und OpenGL-Unterstützung sowie das Graphics View), Qt Desktop (die vollständige Bibliothek) und der Open Source Edition (die vollständige Bibliothek zur Entwicklung von Open-Source-Anwendungen) unterschieden. Diese Unterteilung existiert heute nicht mehr.

Von anderen Anbietern[Bearbeiten]

Da es sich bei Qt um Freie Software handelt, gibt es auch Editionen anderer Anbieter:

  • Qt/Windows Free Edition – Das KDE/Cygwin-Projekt arbeitete an einer nativen Windows-Version von Qt 3, im Blick auf KDE, die vom freien Quellcode der Qt/X11-Variante portiert worden ist und somit auch vollständig GPL-lizenziert ist. Das Projekt wurde gestartet, um auch freie Software für Windows programmieren zu können. Mit dem Erscheinen von Qt 4 hat dieses Bestreben an Aufmerksamkeit verloren und wird nur noch mit kleineren Patches vom qtwin-Projekt weiter gepflegt. In Zukunft will sich das Projekt weiter um Patches zur Qt Open Source Edition von Qt Development Frameworks bemühen, so dass diese dann auch andere Compiler (Microsoft, Borland und Embarcadero Technologies) unterstützt.
  • Das Trinity-Projekt, das eine Abspaltung von KDE 3 entwickelt, pflegt eine Abspaltung von Qt 3 und sieht sich seit November 2011 als zentrale Anlaufstelle für die Qt-3-Entwicklung, nachdem Nokia die Entwicklung eingestellt hatte.[47] Von Seiten Nokias verweist Knut Yrvin, Community Manager bei Trolltech/Nokia[48] auf Trinity.[49]

Design[Bearbeiten]

Das Qt3-Build-System im Detail

Bibliotheksaufbau[Bearbeiten]

Seit Version 4 ist die gesamte Bibliothek in Module gegliedert[50], wodurch kleinere und schnellere Programme möglich sind, da nur die verwendeten Module eingebunden werden müssen. In Version 5 wurde die Modularisierung weiter vorangetrieben, zudem wird nun zwischen Qt Essentials (Basiskomponenten) und Qt Add-Ons (zusätzliche Module für spezielle Einsatzzwecke) unterschieden.

In Qt Essentials sind die folgenden Module enthalten:

  • Qt Core – Kern-Klassen, die von allen anderen Modulen genutzt werden
  • Qt Gui – Basisklassen zur Gestaltung von grafischen Benutzeroberflächen (GUIs), beinhaltet die Unterstützung von OpenGL
  • Qt Widgets – Komponenten zum Erstellen von GUIs in der Programmiersprache C++
  • Qt QML – Klassen zur Verarbeitung der Skriptsprachen QML und JavaScript
  • Qt Quick – Komponenten zum Erstellen von GUIs durch QML
  • Qt Network – Klassen zur Netzwerk-Programmierung
  • Qt Multimedia – Low-Level-Zugriff auf Multimediageräte und -dateien
  • Qt Multimedia Widgets – Zugriff auf Multimediageräte und -dateien durch Widgets
  • Qt Sql – Klasse zur Datenbankintegration mit SQL
  • Qt Test – Werkzeuge zum Testen der eigenen Anwendungen
  • Qt WebKit – Klassen zur Darstellung von Webseiten, basierend auf der WebKit-Engine

Zu den Qt Add-Ons gehören unter anderem Module für zusätzliche Bildformate (Qt SVG / Qt Image Formats), Module zum Zugriff auf Hardware in Smartphones und Tablets (Qt Bluetooth / Qt NFC / Qt Sensors), sowie das in Version 5.4 vorgestellte Modul Qt WebEngine zur Darstellung von Webseiten basierend auf der Chromium-Engine.

In den kommerziellen Editionen sind – je nach Edition – zusätzliche Module enthalten, zum Beispiel zur Visualisierung von Daten (Qt Charts / Qt Data Visualisation).

Programmierbeispiel[Bearbeiten]

Das folgende Beispiel erzeugt ein Fenster mit einem Titel, der aufgrund der geringen Fenstergröße allerdings versteckt ist, einem Beschriftungsfeld (Label) und einer Schaltfläche (Button). Die Funktionen werden mittels „signals“ und „slots“ verbunden, so dass das Programm bei einem Klick auf den Button beendet wird. Die beiden Widgets werden anschließend im Hintergrund gezeichnet und das Fenster schließlich angezeigt. Das Beispielprogramm wird mit dem Aufruf von qmake -project && qmake && make innerhalb des Ordners kompiliert, in dem sich die Datei befindet.

Das Ergebnis des Beispielprogramms
#include <QtGui>

int main(int argc, char **argv) {
	// Eine QApplication stellt immer die Basis dar
	QApplication app(argc, argv);

	// Ein Fenster mit einem Titel erzeugen
	QWidget window;
	window.setWindowTitle("Qt4-Example");

	// Ein Label mit einem Text erzeugen
	QLabel *label = new QLabel("Hello World!");
	label->setAlignment(Qt::AlignCenter);

	// Eine Schaltfläche mit Tastenkürzel Alt-E erzeugen, welcher die Anwendung beendet
	QPushButton *button = new QPushButton("&Exit");
	QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));

	// Sowohl das Label als auch die Schaltfläche horizontal ausrichten
	QVBoxLayout *layout = new QVBoxLayout;
	layout->addWidget(label);
	layout->addWidget(button);
	window.setLayout(layout);

	// Das Fenster anzeigen, die Anwendung starten und ihr Ergebnis (an das Betriebssystem) zurückliefern
	window.show();
	return app.exec();
}

Benutzeroberflächen können mit Qt entweder explizit programmiert oder mit dem Qt-Designer gestaltet werden.

Signal-Slot-Konzept[Bearbeiten]

Eine Besonderheit ist die Verwendung von „signals“ und „slots“, die auf einfache Art und Weise die Kommunikation zwischen einzelnen Objekten ermöglichen. Ein Objekt sendet (emittiert) ein Signal, eine Methode eines anderen Objekts registriert eine Methode als Empfänger (Slot). Verwandte Konzepte sind Funktionszeiger bzw. Rückruffunktion sowie das Beobachter-Entwurfsmuster. Im Signal-&-Slot-Beitrag der Qt-Dokumentation[51] werden die Vor- und Nachteile der unterschiedlichen Ansätze beschrieben. Rückruffunktionen haben den Vorteil, schneller ausführbar zu sein, sind aber nicht automatisch threadsicher. Zudem müssen sich Aufrufer und aufgerufenes Objekt zwangsläufig kennen, was eine enge Kopplung zwischen Modulen bedingt. Qt stellt hiermit eine interessante Modifikation des Beobachter-Entwurfsmusters bereit, welches unter Einhaltung von Konventionen mit einer Zeile Code angewendet werden kann und die lose Kopplung zwischen Modulen unterstützt. Zudem wurde auch Threadsicherheit adressiert. Bezüglich Ausführungsgeschwindigkeit beschreiben die Entwickler, dass auf einem i586-500 in einer Sekunde 2 Millionen Signale an einen Empfänger emittiert werden können, wobei dies noch durch die Anzahl der Empfänger dividiert werden muss, sollte jedoch bei heutiger Rechenleistung wirklich kein Problem mehr sein.

Vor Qt 5 wurde die Typsicherheit von Aufrufparametern lediglich zur Laufzeit überprüft. Mit der Vorstellung von Qt 5 wurde eine alternative Methode vorgestellt, die dies nun bereits zur Kompilierzeit vermag. Die aus dem C++11-Standard bekannten Lambda-Expressions können nun auch als Slots verwendet werden[52].

// Die alte connect Methode
QObject::connect(button, SIGNAL(clicked()), this, SLOT(pushButtonClicked());

// Die neue Variante
QObject::connect(button, &QPushButton::clicked, this, &ExampleObject::pushButtonClicked, Qt::AutoConnection);

// Verwendung einer Lambda-Funktion(C++11) als Slot
QObject::connect(sender, &QObject::destroyed, [=](){ ... });

Beachtung verdient der letzte Aufrufparameter des Beispiels. Durch die optionale Angabe des Verbindungstyps lässt sich die threadübergreifende Kommunikation beeinflussen. [53]

Verbindungstyp/Verhalten Synchron Asynchron
AutoConnection (default) Ja Ja
DirectConnection Ja Nein
QueuedConnection Nein Ja
BlockingQueuedConnection Nein Ja
UniqueConnection Ja Ja

Standardmäßig wird AutoConnection verwendet. Befinden sich Sender und Empfänger im gleichen Thread, verhält sich diese Variante wie DirectConnection. Andernfalls wird QueuedConnection verwendet. Diese dynamische Entscheidung findet auch bei UniqueConnection statt, jedoch ist zu einem Signal lediglich ein Slot erlaubt. BlockingQueuedConnection wartet auf die vollständige Abarbeitung des Slots im anderen Thread und kann daher, wenn sich beide im gleichen Thread befinden, zur Deadlock-Situation führen.

GUI-Simulation[Bearbeiten]

Qt verwendete bis zur neuesten Version eine eigene Zeichenengine sowie Steuerelemente. Es simulierte das unterschiedliche Aussehen auf den verschiedenen Plattformen (GUI-Simulation). Das machte das Portieren einfacher, da nur sehr wenige Klassen in Qt von der verwendeten Plattform abhängig waren. Der Nachteil bestand allerdings darin, dass Qt das Aussehen jeder Plattform präzise nachahmen musste, was nicht immer möglich war. Seit Qt 4.0 gibt es allerdings die Möglichkeit (wie auch in vielen anderen Toolkits, z. B. wxWidgets oder SWT), die betriebssystemeigenen Routinen zum Zeichnen der Elemente zu verwenden. So gibt es nun die nativen QWindowsVistaStyle, QWindowsXPStyle und den QMacStyle. Diese „Styles“ funktionieren nur auf dem passenden Betriebssystem (und sind dort auch der Standard). Es gibt nach wie vor aber auch plattformunabhängige „Styles“, diese lassen sich einfach (z. B. per Kommandozeile) aktivieren. Ab Version 5.0 wurde ein einheitliches Fallbackstyle names Fusion eingeführt.[54]

Werkzeuge[Bearbeiten]

Der Qt-Designer in der Version 4.3.4

Zusätzlich zu den Bibliotheken enthält Qt noch eine Reihe weiterer zusätzlicher Hilfsprogramme, von denen einige unersetzlich für die Arbeit mit Qt sind.

  • Folgende Programme werden vom Programmierer genutzt, um XML-Dateien unter einer komfortablen Benutzeroberfläche zu bearbeiten:
    • Qt-Designer – zum Erstellen von Formularen (*.ui (XML)) und Ressourcen-Dateien (*.qrc (XML))
    • Qt-Linguist – für Übersetzungen des Programms (*.ts (XML))
  • Folgende Programme ermöglichen eine einfache Übersetzung. Zur Steuerung wird die Qt-Projekt-Datei verwendet:
    • lupdate – Extrahiert aus allen Quellcodedateien die zu übersetzenden Strings (→ *.ts (XML))
    • lrelease – *.ts (XML) → *.qm
    • lconvert – Konvertiert zwischen *.po, *.ts, *.xlf und *.qm-Dateien
  • qmake – Erstellt mit der Qt-Projekt-Datei (*.pro) ein Makefile, welches den Erstellungsprozess steuert. Neben den üblichen Programmen wie Compiler und Linker werden auch folgende Programme verwendet:
    • moc – Meta-Object-Compiler, erstellt Meta-Informationen über Klassen des Programms (*.h → moc_*.cpp), siehe unten.
    • uic – Userinterface-Compiler, erstellt C++-Quellcode aus UI-Dateien (*.ui (XML) → ui_*.h)
    • rcc – Ressourcen-Compiler (*.qrc (XML) → qrc_*.cpp)

Für die Benutzung der Online-Dokumentation wird der Qt-Assistant verwendet, der auch in eigene Projekte eingebunden werden kann.

Meta-Object-Compiler[Bearbeiten]

Der Meta-Object-Compiler, auch bekannt als moc, ist ein Werkzeug, welches die Header-Dateien eines Projektes untersucht und Meta-Informationen über Klassen und sonstige Programmteile sammelt. Das geschieht mit Hilfe von „Markierungen“, welche später vom Standard-Präprozessor entfernt werden. Aus diesen Informationen erstellt er wiederum C++-Code, in dem Funktionen implementiert werden, die ohne weitere Bibliotheken in C++ nicht vorhanden sind, wie Introspektion und das Signal-Slot-Konzept. Weitere Makros werden in selbst geschriebenen Header-Dateien expandiert, um deren Funktionsdeklarationen bereitzustellen.

Der Gebrauch eines zusätzlichen Werkzeuges wurde von einem Teil der C++-Programmierer kritisiert. Sie behaupteten, dass Qt-Programmierung keine C++-Programmierung mehr sei. Tatsächlich basiert die Implementation auf C-Makros, die bekanntlich nicht typsicher sind und den Namensraum verunreinigen. Aus der Sicht von Trolltech ist das aber nötig, um das Signal-Slot-Konzept elegant zu implementieren. Als Qt 1.x veröffentlicht wurde, waren die Compilerunterschiede bezüglich generischer Programmierung noch zu groß, als dass man sich auf Vorlagenklassen (Templates) hätte verlassen können. Auch lässt sich die Verunreinigung des Namensraumes durch Verwendung des Makros QT_NO_KEYWORDS vermeiden.

Andere Anbindungen[Bearbeiten]

Die folgende Tabelle zeigt die Anbindungen für verschiedene Programmiersprachen:

Qt-Sprach-Anbindungen
Programmier-
sprache
Name / Beschreibung Qt4 Qt5 Lizenz für
quelloffene
Entwicklung
Lizenz für
proprietäre
Entwicklung
Ada QtAda Ja Nein GPL GMGPL
C++ Qt (natives C++) Ja Ja LGPL LGPL oder
proprietäre Lizenz
C# & .NET Qyoto – Entwicklung eingestellt Ja Nein LGPL
QtSharp – Befindet sich derzeit in Entwicklung unbekannt Ja Apache-Lizenz, Version 2.0
qt4dotnet Ja Nein LGPL
D QtD Ja Nein Boost Software License + GPL
Go Go QML – Anbindung an QML Nein Ja LGPL
Haskell HsQML – Anbindung an QML Ja (bis HsQML 0.2.0.3) Ja (ab HsQML 0.3) BSD-Lizenz
Java Qt Jambi – Wurde anfangs von Qt Software selbst entwickelt. Seit Version 4.5 ist die Weiterentwicklung der Community überlassen.[55] Ja Nein LGPL
Lisp CommonQt – Bindings für Common Lisp Ja Nein BSD-Lizenz
Lua lqt Ja Nein MIT-Lizenz
Pascal Free Pascal Qt4 Binding Ja Ja (als Alpha-Version) LGPL
Perl PerlQt4 Ja Nein GPL Nein
PHP PHP-Qt Ja Nein GPL Nein
Python PyQT Ja Ja GPL Proprietäre Lizenz
PySide – Wurde von Nokia selbst entwickelt, da PyQt nicht unter der LGPL veröffentlicht wurde. Ja Nein LGPL
PyOtherSide – Anbindung an QML Nein Ja ISC-Lizenz
QML QtQuick – Ist seit Version 4.7 ein Teil von Qt Ja Ja LGPL LGPL order
proprietäre Lizenz
R qtinterfaces Ja Nein GPL Nein
Ruby QtRuby Ja Nein LGPL
ruby-qml – Anbindung an QML / Qt Quick Nein Ja MIT-Lizenz
Programmier-
sprache
Name / Beschreibung Qt4 Qt5 Lizenz für
quelloffene
Entwicklung
Lizenz für
proprietäre
Entwicklung

Verwendungsbeispiele[Bearbeiten]

Die KDE Software Compilation 4 kann als größtes und prominentestes Softwareprojekt, das auf Qt basiert, gelten. Daneben findet die Bibliothek aber auch in anderen Anwendungsgebieten breite Verwendung.

Multimedia[Bearbeiten]

Wissenschaft und Technik[Bearbeiten]

Kommunikation[Bearbeiten]

  • die VoIP-Software Skype (nur in der Linux-Version)
  • die proprietäre Sprachkonferenzsoftware TeamSpeak (seit Version 3.0)

Spiele[Bearbeiten]

Sonstige Anwendungen[Bearbeiten]

Anhang[Bearbeiten]

Siehe auch[Bearbeiten]

Literatur[Bearbeiten]

  • Jasmin Blanchette, Mark Summerfield: C++ GUI-Programmierung mit Qt 4, 2. Auflage, Addison-Wesley, Dezember 2008, ISBN 978-3-8273-2729-1
  • Daniel Molkentin, André Pönitz: Qt 4. Einführung in die Applikationsentwicklung, 2. Auflage, Open Source Press, März 2010, ISBN 978-3-937514-99-4
  • Jürgen Wolf: Qt 4.6 – GUI-Entwicklung mit C++, 2. Auflage, Galileo Computing, Januar 2010, ISBN 978-3-8362-1542-8
  • Helmut Herold: Das QT-Buch: Portable GUI-Programmierung unter Linux/Unix/Windows, 2. Auflage, Millin, August 2004, ISBN 978-3-89990-122-1

Weblinks[Bearbeiten]

 Commons: Qt – Sammlung von Bildern, Videos und Audiodateien
 Wikibooks: Qt für C++-Anfänger – Lern- und Lehrmaterialien

Einzelnachweise[Bearbeiten]

  1. a b Michael Larabel: Qt 5.0 Is Going To Like LLVMpipe, Wayland. phoronix.com, 8. Mai 2012, abgerufen am 29. Juni 2014 (englisch).
  2. Support for Symbian. 25. Juni 2014, abgerufen am 14. März 2015 (englisch).
  3. a b Symbian support is going to be removed in Qt 5.0! 1. Februar 2012, abgerufen am 16. März 2015 (englisch).
  4. a b Community Supported Platforms. Abgerufen am 13. März 2015 (englisch).
  5. Qt Licensing. Abgerufen am 13. März 2015 (englisch).
  6. Adding LGPL v3 to Qt. 20. August 2014, abgerufen am 30. März 2015 (englisch).
  7. a b Ashlee Vance: That Smartphone Is So Qt. 16. Februar 2010, abgerufen am 13. März 2015 (englisch).
  8. Jasmin Blanchette, Mark Summerfield: C++ GUI Programming with Qt 4, Seite XV, ISBN 0-13-187249-4
  9. a b Louis Goddard: Digia to pay Nokia €4 million for Qt as framework heads towards cross-platform future. theverge.com, 10. August 2012, abgerufen am 11. August 2012 (englisch).
  10. Alexander Neumann: Nokia macht mit Qt Project Schritt in Richtung „echter“ Open-Source-Entwicklung. heise.de, 24. Oktober 2011, abgerufen am 11. Juli 2012.
  11. Digia to acquire Qt commercial licensing business from Nokia. 7. März 2011, abgerufen am 13. März 2015 (englisch).
  12. Alexander Neumann: Digia übernimmt Nokias restliche Qt-Aktivitäten. In: heise online. 9. August 2012, abgerufen am 28. Juni 2014.
  13. Qt-Geschäft wird Tochterunternehmen von Digia. 7. August 2014, abgerufen am 2. Juli 2015.
  14. KDE Free Qt Foundation. kde.org, abgerufen am 3. April 2010 (englisch).
  15. Joseph Carter: Why Debian Doesn’t Include KDE. 17. Juni 2000, abgerufen am 13. März 2015 (englisch).
  16. Trolltech to Extend Dual Licensing to Qt for Windows (Memento vom 12. August 2011 im Internet Archive)
  17. Nokia Corporation Qt GPL Exception Version 1.3. Abgerufen am 13. März 2015 (englisch).
  18. Oliver Lau: Mehr Open-Source-Lizenzen für Qt. In: heise online. 9. August 2007, abgerufen am 3. April 2010.
  19. Angela Meyer: Qt ist nun auch unter GPLv3 lizenzierbar. In: heise online. 19. Januar 2008, abgerufen am 3. April 2010.
  20. Qt 4.5, Qt Creator released (Memento vom 12. August 2011 im Internet Archive)
  21. Using the Digia Qt Framework (LGPL) for “commercial” applications. baltazaar, 20. Juli 2013, abgerufen am 29. Juni 2014 (englisch).
  22. Mika Pälsi: Benefits of the Indie Mobile Licensing. 1. Oktober 2014, abgerufen am 23. März 2015 (englisch).
  23. Turunen Tuukka: Indie Mobil Program terminated? Qt Interest mailing list, 2. Juli 2015, abgerufen am 2. Juli 2015.
  24. Trolltech Releases Qt 4.1. 20. Dezember 2005, abgerufen am 3. April 2010 (englisch).
  25. Trolltech Brings Style Sheets to Desktop Applications with Qt 4.2. 4. Oktober 2006, abgerufen am 3. April 2010 (englisch).
  26. Trolltech Releases Qt and Qtopia Core 4.3. 30. Mai 2007, abgerufen am 3. April 2010 (englisch).
  27. Qt 4.4 Framework Broadens Rich Application Development with Integration of Web Content and Portability to Mobile Devices. 6. Mai 2008, abgerufen am 3. April 2010 (englisch).
  28. Alexander Neumann: Qt 4.5 und Entwicklungsumgebung Qt Creator veröffentlicht. In: heise online. 3. März 2009, abgerufen am 3. April 2010.
  29. Nokia Releases Qt 4.6. 1. Dezember 2009, abgerufen am 3. April 2010 (englisch).
  30. Nokia Releases Qt 4.7. 21. September 2010, abgerufen am 26. September 2010 (englisch).
  31. Nokia Releases Qt 4.8. 15. Dezember 2011, abgerufen am 15. Dezember 2011 (englisch).
  32. Julia Schmidt: Neu organisiert: Qt 5.0 ist fertig. heise.de, 20. Dezember 2012, abgerufen am 22. Dezember 2012.
  33. Digia releases Qt 5.1. 3. Juli 2013, abgerufen am 14. März 2015.
  34. Matthias Nagorni: Qt Developer Days Europe: Wohin steuert Qt? heise.de, 31. Oktober 2014, abgerufen am 14. März 2015.
  35. Qt Documentation – What’s New in Qt 5.4. Abgerufen am 14. März 2015 (englisch).
  36. C++-Klassenbibliothek Qt 5.5: Fokus auf Stabilität und Performance. heise.de, 2. Juli 2015, abgerufen am 2. Juli 2015.
  37. a b Download Qt. Abgerufen am 16. März 2015 (englisch).
  38. Qt-5-on-Nokia-N9. Abgerufen am 16. März 2015 (englisch).
  39. Qt Software discontinues Qt Extended (Memento vom 8. März 2009 im Internet Archive)
  40. KDE on OpenSolaris
  41. Qt Applications and UI Framework for Haiku
  42. Qt 4 Application and UI Framework for eCS
  43. OS4Depot page for „First Alpha release of Qt 4.7 for AmigaOS Native“
  44. Qt webOS port
  45. Blog: Qt on the Palm Pre
  46. Blog: Qt on Amazon Kindle DX
  47. Sebastian Grüner: Aktualisierungen für KDE SC 4.7 und KDE 3.5. golem.de, 11. März 2011, abgerufen am 14. März 2015.
  48. Open Linux developer phone opens up more. linuxfordevices.com, 5. März 2007, abgerufen am 10. Juli 2012 (englisch).
  49. Knut Yrvin auf Qt Blog (urspr. Qt Labs). 16. Januar 2012, abgerufen am 14. März 2015.
  50. Trolltech Releases Qt 4.0. 28. Juni 2005, abgerufen am 26. März 2015 (englisch): „Unlike previous Qt releases, Qt 4 is a collection of smaller libraries […]“
  51. http://qt-project.org/doc/qt-4.8/signalsandslots.html
  52. http://qt-project.org/doc/qt-5/qt5-intro.html
  53. http://qt-project.org/doc/qt-4.8/threads-qobject.html
  54. Digia Qt Blog – Cleaning up styles in Qt5 and adding Fusion
  55. Qt Software to discontinue Qt Jambi after 4.5 release (Memento vom 7. August 2011 im Internet Archive)
  56. Applications_Using_QtWebKit | Qt Wiki | Qt Project
  57. http://qt.nokia.com/qt-in-use/story/customer/esa-european-space-agency (Memento vom 23. Juli 2011 im Internet Archive)Vorlage:Webarchiv/Wartung/Linktext_fehlt Qt in der ESA