[[Vorlage(Getestet, focal, bionic)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Einen Terminal öffnen] }}} [[Inhaltsverzeichnis(1)]] [https://www.qt.io/ Qt] {en} (gesprochen englisch [https://dict.leo.org/german-english/cute cute] {de}) ist ein C++-Framework zur plattformunabhängigen Erstellung von Software. Direkt unterstützte Sprachen sind C/C++, [#QML QML] und [:Python:] über [https://doc.qt.io/qtforpython/ PySide] {en}, es existieren aber zusätzliche Anbindungen für [https://wiki.qt.io/Language_Bindings viele andere Sprachen] {en} wie [:Go:], [:Java:] und [wikipedia:Rust_(Programmiersprache):Rust]. [:KDE:KDE-Software], inklusive des [:Plasma:Plasma-Desktops] verwenden seit jeher Qt als Basis und die KDE-Community trägt aktiv zur Entwicklung von Qt bei. Andere bekannte Programme sind bspw. der [:LXQt:]-Desktop von [:Lubuntu:], der [:Nextcloud:Nextcloud-Client], [:VirtualBox:] oder der für ubuntuusers.de entwickelte Editor [:InyokaEdit:]. [:Ubuntu_Touch:] nutzt ebenfalls Qt. Es gibt derzeit fünf [https://www.qt.io/licensing/ Lizenzmodelle] {en} für Qt, darunter auch Open-Source-Lizenzen GPL und LPGL. Den größten Bekanntheitsgrad hat Qt als Bibliothek zur Erstellung von grafischen Benutzeroberflächen, jedoch bringt Qt eine Vielzahl weiterer Module mit sich, die die Programmierung vereinfachen wie bspw. Netzwerkprogrammierung, Datenbankabstraktion, XML, OpenGL uvm. Mit Hilfe von Qt ist die Erstellung plattformübergreifender Anwendungen möglich. Neben den Unix-Derivaten mit [:XServer:] oder [wikipedia:Wayland_(Display-Server-Protokoll):Wayland] als Darstellungsserver werden u.a. Microsoft Windows, Apples Mac OS und iOS sowie Googles Android unterstützt. Dabei ist hervorzuheben, dass Qt für jede Plattform das gewohnte native [wikipedia:Look_and_Feel:] mitbringt. Eine Übersicht der unterstützten Plattformen findet sich unter [https://www.qt.io/product/supported-platforms-languages Supported Platforms, Targets and Languages] {en} = Installation = Das grundlegende Paket bringt die nötigen, minimalen Konfigurationen und Bibliotheken mit, muss aber im Normalfall durch weitere Pakete ergänzt werden. Qt ist sehr gut dokumentiert. Die Dokumentation ist online verfügbar, kann aber auch mit Hilfe des Paketes '''qt5-doc''' offline verfügbar gemacht werden, was sich vor allem bei der Verwendung einer Entwicklungsumgebung lohnt. Ebenfalls stehen viele Beispiele zur Verfügung, die über zusätzliche Pakete installiert werden können (zur Suche kann man `apt search qt5 demo` oder `apt search qt5 example` verwenden). {{{#!vorlage Paketinstallation qt5-default, universe qt5-qmake, universe (optional) qtbase5-dev-tools, universe (optional) qt5-doc, universe (optional) }}} {{{#!vorlage Hinweis Bei Ubuntu und Xubuntu müssen separate Bibliotheken wie die Netzwerk- oder [:D-Bus:]-Unterstützung zusätzlich installiert werden. In den anderen Derivaten gehören sie zur Standardinstallation dazu. }}} = Benutzung = Die Wahl des [:Editor:Editors] ist natürlich frei, es steht aber mit dem [:Qt_Creator:QtCreator] eine ausgereifte [:Entwicklungsumgebungen:Entwicklungsumgebung] zur Verfügung, die sowohl Möglichkeiten zum Debugging, zur Analyse, Übersetzung und einen grafischen Editor mitbringt als auch die Möglichkeit bietet, in virtuellen Maschinen oder direkt auf einem Zielgerät zu testen oder zu installieren. Daneben stehen dem Entwickler viele Beispiele zur Verfügung. [https://www.kdevelop.org/ KDevelop] {en} ist ebenfalls eine Entwicklungsumgebung für Qt, die spezialisiert auf Software von der und für die KDE-Community ist, aber natürlich auch frei eingesetzt werden kann. Als Build-Umgebung wird `qmake` oder [:CMake:cmake] eingesetzt. In zukünftigen Versionen (ab dem Release von Qt6) wird auf `cmake` als Standard umgestellt. == Signale und Slots == Einer der Gründe für den Erfolg des Qt-Frameworks sind Signale und Slots anstelle der ansonsten üblichen Callback-Funktionen. Diese dienen zur typsicheren Interprozesskommunikation und ermöglichen eine einfache Umsetzung von Ereignisbedingungen, die voneinander ausgelöst werden können. Dabei weiß der Sender nicht, ob oder wie viele Empfänger er bedient, so dass beliebig viele Aktionen von einem Signal ausgelöst werden können. Mittlerweile ist das Konzept in vielen anderen Bibliotheken vorhanden und stellt kein Alleinstellungsmerkmal dar. == QML == QML ist die '''Q'''t '''M'''odeling '''L'''anguage, die für die einfache und dynamische Gestaltung von Benutzeroberflächen entwickelt worden ist. QML ist deklarativ, die Syntax basiert auf JavaScript und JSON, ist aber dazu nicht kompatibel. Mit Hilfe von QML ist es möglich, das UI (UserInterface/die Benutzeroberfläche) unabhängig von der darunterliegenden Programmierung zu entwickeln. Auch wenn QML mit QtQuick in natives C++ kompiliert werden kann, ist es auch möglich, per Interpreter ausgeführt zu werden, sodass die Implementierung der UI in Form von Textdateien ausgeliefert werden kann. Zudem kann per import-Anweisung auf eine Vielzahl an verschiedenen C++-Methoden und Objekte zugegriffen werden. Ein Beispiel dafür sind die in [:Plasma:] genutzten Mini-Programme, die "Plasmoid" oder "Plasma-Applet" genannt werden. == Projektdatei (.pro) == Qt verwendet zur einfachen, plattformübergreifenden Beschreibung des build-Vorgangs Projektdateien. Diese bestehen aus den einzubeziehenden Modulen/Konfigurationen und enthalten eine Dateiliste der zu kompilierenden und zu linkenden Einzelteile. Ebenso können plattformspezifische Teile über Bedingungen („if-Abfragen“) angegeben werden. == qmake == [https://doc.qt.io/qt-5/qmake-manual.html QMake] {en} ist ein Helfer-Programm, das zur einfachen Generierung einer Projektdatei oder des [:Makefile:Makefiles] — oder des Äquivalents auf anderen Plattformen — dient und die entsprechenden Standard-Qt-Bibliotheken automatisch einbindet. Zusätzliche Module oder Konfigurationen können beim Aufruf mit angegeben werden, wie das mit QWidgets im [#das_erste_Programm Beispiel] gezeigt wird. == cmake == Qt unterstützt ebenfalls [:CMake:cmake] als Build-System, welches ab Qt6 zum Standard wird. == Das erste Programm == Natürlich kann hier keine erschöpfende Einführung in Qt und die verschiedenen von Qt verwendeten Konzepte gegeben werden. An dieser Stelle sei auf [#Links externe Literatur] verwiesen. Im Folgenden wird die Erstellung einer einfachen Qt5-Anwendung gezeigt. '''helloworld.cpp''': {{{#!code cpp #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton hello("Hello world!"); hello.show(); return app.exec(); } }}} '''helloworld.pro''': Die Datei kann manuell oder mit {{{#!vorlage befehl qmake -project 'QT += widgets' }}} angelegt werden. {{{#!code text QT += widgets TEMPLATE = app TARGET = helloworld SOURCES += helloworld.cpp }}} Das Programm kann man dann kompilieren und ausführen[2]: {{{#!vorlage Befehl qmake make ./helloworld }}} = Problemlösungen = == Debugmodus für Qt-Anwendungen == Für Qt existieren einige mögliche [:Umgebungsvariablen:]. Um ein Programm gesprächiger zu machen, kann es mit {{{#!vorlage befehl QT_DEBUG_PLUGINS=1 Programm }}} gestartet werden. = Links = == extern == * [https://qt.io Qt-Website] {en} * [https://resources.qt.io/development-topic-getting-started-with-qt Getting Started With Qt] {en} bietet eine Übersicht mit Webinaren, Videos und Tutorials. * [https://wiki.python.org/moin/PyQt/Tutorials PyQt-Tutorials] auf python.org {en} * [https://docs.ubports.com/de/latest/appdev/index.html Ubuntu Touch — App-Entwicklung] {en} * [http://qtcentre.org/ Qt Centre] {en} - Qt Community Seite * [http://qtforum.de/forum/ Deutschsprachiges Qt-Forum] {de} * [http://www.proggen.org/doku.php?id=frameworks:qt:start Deutsches Qt-Tutorial auf proggen.org] {de} * [https://techbase.kde.org/Development/Tutorials/Plasma5 KDE TechBase Plasma 5 Tutorials] {en}/{de} * [http://www.qt-apps.org/ Qt-Apps.org] {en} - Softwareverzeichnis von Qt-Applikationen == intern == * [https://wiki.ubuntuusers.de/wiki/tags/Qt/ Programme] im hiesigen Wiki, die auf Qt basieren # tag: Qt