Was ist Qt und wie erstellt man GUIs damit?
Wir behandeln Qt-bezogene Themen auf unserem Blog, aber erst kürzlich ist uns aufgefallen, dass viele unserer Leser vielleicht gar nicht […]
Qt Graphs ist ein leistungsstarkes Modul des Qt-Frameworks, das Entwicklern die Erstellung interaktiver, sowohl statischer als auch dynamischer 2D-Diagramme und 3D-Datenvisualisierungen ermöglicht. Auf den ersten Blick mag es keine bahnbrechende Neuerung darstellen, da diese Funktionalität bereits in früheren Qt-Modulen wie Qt Charts und Qt Data Visualization vorhanden war. Dennoch fasst es diese Funktionen zusammen und führt zahlreiche Verbesserungen und Erweiterungen ein, sowohl im Hintergrund als auch in sichtbarer Form.
Mit der aktuellen Veröffentlichung von Qt 6.8 hat das Graphs-Modul offiziell den Tech-Preview-Status verlassen. In diesem Blogbeitrag werfen wir einen genaueren Blick darauf, was sich geändert hat, warum diese Änderungen vorgenommen wurden und welche Auswirkungen sie auf das Leben eines Qt-Entwicklers haben.
Falls Ihr Projekt von eleganten und dynamischen Visualisierungen profitieren könnte, besuchen Sie unsere Seite Qt-Entwicklungsdienstleistungen, um zu erfahren, wie wir Ihnen helfen können.
Die ersetzten Module stammen aus der frühen Qt-5-Ära. Im Laufe der Jahre wurde der Bedarf an besserer Leistung immer deutlicher, da moderne Anwendungen eine effizientere Renderleistung und größere Flexibilität erfordern.
Die Rendering-Engine in Qt Data Visualization, die auf OpenGL basiert, musste auf Geräten mit OpenGL ES 2 laufen, was den Zugriff auf erweiterte OpenGL-Funktionen einschränkte. Zudem erzwang sie die Verwendung von OpenGL für UI-Komponenten, was auf bestimmten Plattformen, wie Windows mit seinem nativen Direct3D, zu einer suboptimalen Leistung führen konnte.
Das Qt-Charts-Modul hingegen basiert auf dem Qt Graphics View Framework und ist daher eng mit dem Widget-Framework verbunden. Dies führte in vielen Fällen zu softwarebasiertem Rendering, was die Effizienz zusätzlich beeinträchtigte.
Qt Graphs behebt viele dieser Probleme. Das 3D-Modul basiert auf Qt Quick 3D und nutzt Qt RHI (Qt Rendering Hardware Interface), um das optimale Rendering-Backend für die jeweilige Zielplattform zu verwenden, einschließlich Direct3D, Vulkan oder Metal. Das 2D-Modul von Qt Graphs verwendet hingegen das Quick-Framework und profitiert daher von hardwarebeschleunigtem Rendering. Diese Kombination verbessert sowohl die Leistung als auch die Flexibilität erheblich.
Ein weiterer Grund für die Einführung des neuen Moduls war die bisherige Trennung zwischen 2D- und 3D-Datenvisualisierung. Qt Graphs vereint das Qt Charts-Modul (2D) und das Qt Data Visualization-Modul (3D) in einem einzigen Modul, was bereits für sich genommen eine praktische Verbesserung darstellt. Falls eine solche Trennung dennoch erforderlich ist, beispielsweise bei der Arbeit mit einem eingebetteten Gerät mit begrenzten Ressourcen, gibt es Möglichkeiten, das Modul nur mit 2D- oder 3D-Unterstützung zu erstellen.
Interessanterweise bringt die Verwendung von Qt Quick 3D für die Implementierung von Qt Graphs auch neue Funktionen mit sich. Es ist nun nicht nur möglich, QQuick3D-Elemente einfach in Diagramme zu integrieren, sondern auch die Qt Quick 3D-Szene durch die Definition einer SceneEnvironment oder ExtendedSceneEnvironment in der Umgebungseigenschaft zu erweitern. Dadurch kann konfiguriert werden, wie eine Szene gerendert wird, einschließlich Lichtsteuerung, Hintergrundkonfiguration, Nebeleffekte, Tone Mapping und verschiedenen Post-Processing-Effekten.
Darüber hinaus können wir eine Quick 3D-Szene importieren, indem wir ein Node-Element der Eigenschaft importScene zuweisen. Ein Node-Objekt stellt eine Entität innerhalb der 3D-Szene dar und dient als Basisklasse für andere räumliche Typen wie Model, Camera und Light. Dies eröffnet unbegrenzte Möglichkeiten zur individuellen Anpassung der Diagrammszenen.
Ich könnte noch weiter ins Detail gehen, aber um es kurz zu halten, hier eine Zusammenfassung der weiteren Änderungen:
Vereinfachte Eingabeverarbeitung: Mehrere Eingabe-Handler (QAbstract3DInputHandler, QInput3DHandler, QTouch3DInputHandler) wurden in einem einzigen QGraphsInputHandler zusammengeführt. Auf der 2D-Seite werden QuickItem-Ereignisse nun direkt verarbeitet, wodurch die Notwendigkeit der Ereignisübersetzung von QuickItem zur Grafikszene entfällt.
Verbesserte Datenverarbeitung: Die API erfordert keine Heap-zugewiesenen Datenarrays mehr. Durch Move-Semantik werden unnötige Kopien vermieden. Proxies speichern keine Daten mehr, sondern leiten sie direkt an die Serien weiter.
Widget-Kompatibilität: Widgets können weiterhin verwendet werden, allerdings muss anstelle eines normalen QWidget ein QQuickWidget eingesetzt werden.
Überarbeitung der Themes: Q3DTheme wurde durch QGraphsTheme ersetzt, das in zwei logische Teile unterteilt ist: Theme und Farbschema. Die Farbschemata wurden modernisiert und bieten nun helle, dunkle und automatische Optionen.
Transparenz: Wird jetzt sowohl in Bars3D als auch Scatter3D unterstützt.
Optimiertes Rendering: Modell-Instanziierung wurde für 3D-Balken- und Streudiagramme eingeführt, was eine effiziente Darstellung großer Datensätze ermöglicht. Bei Oberflächendiagrammen wird die Vertex-Positionierung nun durch den Vertex-Shader direkt von der GPU übernommen.
Zusammenfassend bietet das Qt Graphs-Modul eine einfache und effiziente Möglichkeit für Qt-Entwickler, Datenpunkte sowohl in Widget- als auch in QML-Anwendungen zu visualisieren. Trotz einiger fehlender Funktionen vereinfacht es bereits den Arbeitsablauf, reduziert Abhängigkeiten, verbessert die Leistung und führt neue Funktionen ein – ein wertvolles Werkzeug zur Gestaltung moderner Benutzeroberflächen.
<meckern>
Um nicht nur alles in rosigen Farben darzustellen, muss ich zugeben, dass einige Funktionen der vorherigen Module bislang noch keinen Platz im neuen gefunden haben.
Was beim Erstellen eines Diagramms – sei es 2D oder 3D – sofort auffällt, ist das Fehlen von Legenden und Titeln. Während das Fehlen eines Diagrammtitels relativ einfach umgangen werden kann, bedeutet das Fehlen einer integrierten Legende einen erheblichen Mehraufwand, um eine datenbezogene Visualisierung in einen passenden Kontext zu setzen.
Das GraphsTheme scheint noch nicht vollständig ausgereift zu sein – es beeinflusst das Erscheinungsbild des Diagramms nicht immer wie erwartet.
Einige Diagramm-Eigenschaften funktionieren entweder nicht oder verhalten sich anders als in der Dokumentation beschrieben.
Apropos Dokumentation: Sie könnte an manchen Stellen ausführlicher sein, und es wäre hilfreich, wenn alle Hyperlinks vollständig und funktional wären. Es kam ein- oder zweimal vor, dass ich direkt in den Quellcode schauen musste, um mögliche Enum-Werte zu finden, da die zugehörige Tabelle in der Dokumentation nicht zugänglich war.
Der Quellcode selbst hat in meiner Erfahrung mit Qt Graphs eine aufklärende Rolle gespielt – beispielsweise, wenn ein Signal existierte, aber nicht in der Dokumentation erwähnt wurde, oder wenn eine Methode, die laut Dokumentation existieren sollte, in Wirklichkeit gar nicht vorhanden war.
</meckern>
Insgesamt gibt es einige in der Dokumentation als bekannte Probleme oder fehlende Funktionen aufgeführte Punkte, die in der Qt 6.8-Version noch nicht implementiert wurden. Dazu gehören bestimmte Typen von 2D-Diagrammen, die bereits erwähnten Titel und Legenden, Schatten- und Transparenzeffekte bei Surface 3D, sowie die Transparenz von hervorgehobenen Elementen in Bars 3D und Scatter 3D – und noch einige weitere Punkte.
Es ist jedoch wichtig zu bedenken, dass das Modul gerade erst veröffentlicht wurde. Die Entwicklung wird sicherlich nicht hier aufhören, und es ist zu erwarten, dass die Qt-Community und die Entwickler viele dieser fehlenden Features in zukünftigen Versionen ergänzen werden.
Im Folgenden sind einige Beispiele dafür aufgeführt, was mit dem neuen Modul möglich ist. Vieles davon wäre mit Qt Charts nicht umsetzbar.
Ein einfaches Diagramm mit einem statischen Datensatz und einem benutzerdefinierten Punkt-Delegate.
Ein 2D-Streuungsdiagramm
Ausgabenbalken, die ihre entsprechenden Einnahmenbalken übersteigen, werden markiert. Eine On-Appearance-Animation wurde als zusätzlicher Effekt hinzugefügt.
Ein 2D-Balkendiagramm
Ein statisches Flächendiagramm. Das Erstellen einer optisch ansprechenden Datenpräsentation war schwieriger, als ich dachte.
Ein 2D-Flächendiagramm
Ein Spline-Diagramm mit dynamisch hinzugefügten Punkten und einem benutzerdefinierten Punkt-Delegate. Verwendet GraphPoint- und SplineControl-Animationen. Ehrlich gesagt scheint es unter bestimmten Bedingungen etwas fehlerhaft zu sein, aber mit der richtigen Behandlung liefert es ein durchaus ansehnliches Ergebnis.
Ein 2D-dynamisches Spline-Diagramm
Das Diagramm profitiert von den Glow-Eigenschaften des ExtendedSceneEnvironment.
Ein 3D-Oberflächendiagramm mit Quick3D-Glow-Effekten
Dieses Beispiel war besonders interessant: Eine Kugel wurde als Model innerhalb eines Node-Objekts hinzugefügt, das der Eigenschaft importScene zugewiesen wurde. Die „Disco-Vibes“ stammen von dem Lens-Flare-Effekt des ExtendedSceneEnvironment.
Ein 3D-Balkendiagramm mit einer importierten Quick3D-Szene
Zusammenfassend bietet das Qt Graphs-Modul eine einfache und effiziente Möglichkeit für Qt-Entwickler, Datenpunkte in Widget- und QML-Anwendungen zu visualisieren. Trotz einiger noch fehlender Funktionen vereinfacht es bereits jetzt Arbeitsabläufe, reduziert Abhängigkeiten, verbessert die Leistung und führt neue Features ein – ein wertvolles Werkzeug für die Erstellung moderner Benutzeroberflächen.
Kommen wir zur Sache: Es ist eine Herausforderung, Top-Qt-QML-Entwickler zu finden. Helfen Sie sich selbst und starten Sie die Zusammenarbeit mit Scythe Studio – echten Experten im Qt C++ Framework.
Entdecken Sie unsere Fähigkeiten!Wir behandeln Qt-bezogene Themen auf unserem Blog, aber erst kürzlich ist uns aufgefallen, dass viele unserer Leser vielleicht gar nicht […]
Eingebettete Systeme sind überall – von Haushaltsgeräten bis hin zu industriellen Maschinen. Im Kern dieser Systeme befindet sich die Embedded-Firmware, […]
Fragen Sie sich, wie man D-Bus mit Qt 6 verwendet? Dann sind Sie hier genau richtig! In diesem Beitrag werfen […]