Qt Graphs Datenverarbeitung mit 3D
Serie
Eine Serie kombiniert eine logisch zusammenhängende Menge von Datenelementen und visuelle Eigenschaften, die beschreiben, wie die Datenelemente gerendert werden sollen, z. B. Elementnetze und Farben. Jeder Diagrammtyp hat seinen eigenen Serientyp. Balkendiagramme zum Beispiel verwenden QBar3DSeries. Zu allen Diagrammen können gleichzeitig mehrere Serien hinzugefügt werden. Jede Serie besitzt ihre eigenen Daten.
Dieser Codeschnipsel zeigt, wie man QBar3DSeries verwendet, um Balken als Zylinder und mit einem Farbverlauf anstelle einer einheitlichen Farbe darzustellen:
QQuickWidget quickWidget; Q3DBarsWidgetItem graph; graph.setWidget(&quickWidget); QBar3DSeries series; QLinearGradient barGradient(0, 0, 1, 100); barGradient.setColorAt(1.0, Qt::white); barGradient.setColorAt(0.0, Qt::black); series.setBaseGradient(barGradient); series.setColorStyle(QGraphsTheme::ColorStyle::ObjectGradient); series.setMesh(QAbstract3DSeries::Mesh::Cylinder); graph.addSeries(&series);
Daten Proxies
Die Daten, die Benutzer visualisieren möchten, liegen in vielen Formaten vor, die nicht alle direkt unterstützt werden können. Daher implementiert Qt Graphs Daten-Proxies, in die der Benutzer seine Daten in einem bekannten Format einspeisen kann. Jedes Diagramm hat einen grundlegenden Proxy-Typ in seiner Serie, der Daten in einem für dieses Diagramm geeigneten Format aufnimmt. Da die Daten in Serien gespeichert werden, sind bei der Proxy-Serien-Beziehung einige Punkte zu beachten. Erstens können die Benutzer bei dieser Implementierung über die Reihen auf die Daten zugreifen. Wenn ein Benutzer Operationen an diesen Daten durchführen möchte, z. B. Hinzufügen oder Entfernen, kann er diese Operationen weiterhin über das Proxy durchführen. Um diese Operationen durchzuführen, ist es jedoch erforderlich, eine mit diesem Proxy verknüpfte Serie zu erstellen.
Der Basis-Proxy für QBar3DSeries ist zum Beispiel QBarDataProxy, der verwendet wird, um der Serie Daten als QBarDataItem Objekte hinzuzufügen. Jedes QBarDataItem enthält einen einzelnen Balkenwert. Zusätzliche Typendefinitionen werden für die Container QBarDataArray und QBarDataRow bereitgestellt.
Dieser Codeschnipsel zeigt, wie Sie Basic Proxy verwenden, wenn Ihre Daten in einem hypothetischen myData
Objekt gespeichert sind, das die Daten als QBarDataItems zurückgibt:
QQuickWidget quickWidget; Q3DBarsWidgetItem graph; graph.setWidget(&quickWidget); QBar3DSeries series; for (int i = 0; i < 10; ++i) { QBarDataRow dataRow; for (int j = 0; j < 5; ++j) dataRow.append(myData->getValue(i, j)); series.dataProxy()->addRow(dataRow); } graph.addSeries(&series);
Hinweis: Serienobjekte können jeweils nur einen einzigen Proxy besitzen. Der vorhandene Proxy wird gelöscht, wenn ein anderer für die Serie festgelegt wird. Diagramme können jedoch mehrere Serien enthalten. Wenn Sie zwischen zwei verschiedenen Datensätzen hin- und herwechseln müssen, ist es in der Regel effizienter, jeden Satz in einer anderen Serie zu speichern und nur die Serie zu ändern, anstatt die Daten in der Serie mit Hilfe eines Proxys jedes Mal zurückzusetzen, wenn Sie wechseln müssen.
Elementmodelle und Datenmapping
Für häufige Anwendungsfälle bietet Qt Graphs spezielle Proxys. Ein solcher Fall ist die Speicherung von Daten in einem Item Model (QAbstractItemModel subclass), einer gängigen Methode zur Speicherung von Daten in Qt-Anwendungen. Jeder Typ des Graphen bietet eine spezielle Proxy-Klasse für diesen Zweck, zum Beispiel QItemModelBarDataProxy für QBar3DSeries. Diese Proxies sind einfach zu verwenden: Geben Sie ihnen einen Zeiger auf das Elementmodell, das die Daten enthält, und legen Sie die Regeln fest, wie die Daten in ein Format gemappt werden sollen, das der Basis-Proxy verarbeiten kann.
Das Mapping funktioniert mit Elementmodellrollen. Jedes Datenelement im Modell kann verschiedene Werte für verschiedene Rollen haben. Bei QItemModelBarDataProxy können Sie beispielsweise angeben, welche Rolle verwendet wird, um zu bestimmen, zu welcher Zeile das Element gehört, welche Rolle das Gleiche für Spalten tut und welche Rolle den Wert des Elements angibt. Wenn der Proxy die Daten aus dem Modell auflöst, verwendet er diese Zuordnungen, um die Zeilen und Spalten des Balkendiagramms zu erzeugen.
Oft haben die Elementmodelle eine einzige Rolle, die Informationen enthält, die Sie mehreren Werten zuordnen möchten. Ein typisches Beispiel hierfür ist ein Zeitstempelfeld bei der Erstellung eines Balkendiagramms mit zwei zeitbezogenen Achsen, z. B. Jahre und Monate. Um die Zuordnung einer einzelnen Elementmodellrolle zu mehr als einem Datenfeld zu ermöglichen, sollten Elementmodell-Proxys einen Mechanismus zum Vergleichen und Ersetzen von Mustern implementieren. Sie können diesen Mechanismus auch verwenden, um Daten selbst in Fällen einer Eins-zu-eins-Zuordnung neu zu formatieren.
Je nach Diagrammtyp können Proxys auch andere Funktionalitäten unterstützen, wie z. B. QItemModelBarDataProxy, das optional Zeilen und Spalten von QAbstractItemModel direkt auf Zeilen und Spalten von Balkendiagrammen abbildet.
Weitere Informationen und Beispiele zu ihrer Verwendung finden Sie in den einzelnen Proxy-Klassen: QItemModelBarDataProxy, QItemModelScatterDataProxy, und QItemModelSurfaceDataProxy.
Andere benutzerdefinierte Proxies
QHeightMapSurfaceDataProxy ist ein spezieller Proxy für die Erzeugung eines Oberflächendiagramms aus einem Heightmap-Bild. Weitere Informationen finden Sie in der Dokumentation QHeightMapSurfaceDataProxy.
Das Beispiel der Graph Gallery auf der Registerkarte Bar Graph zeigt, wie ein benutzerdefinierter Proxy erstellt werden kann. Es definiert einen benutzerdefinierten Datensatz auf der Grundlage von Variantenlisten und eine Erweiterung des Basis-Proxys, um diese Daten mit einem zugehörigen Mapper aufzulösen.
Umgang mit Echtzeitdaten
Wenn Sie einen Datensatz haben, der schnell aktualisiert wird, ist es wichtig, die Daten richtig zu behandeln, um eine gute Leistung zu gewährleisten. Da die Speicherzuweisung eine kostspielige Operation ist, sollten Sie nach Möglichkeit immer QList::reserve() und QList::resize() verwenden, um unnötige Neuzuweisungen bei der Erstellung des Arrays zu vermeiden, das Sie dem Proxy übergeben.
Wenn Sie müssen:
- den gesamten Datensatz für jeden Frame ändern müssen, ist es in den meisten Fällen am besten, das bestehende Array wiederzuverwenden, insbesondere wenn sich die Array-Dimensionen nicht ändern.
- mehrere Zeilen oder Elemente für jeden Frame hinzuzufügen, einzufügen, zu entfernen oder zu ändern, ist es immer effizienter, dies mit einem Methodenaufruf zu tun, anstatt mit mehreren Aufrufen, die jeweils eine einzelne Zeile oder ein einzelnes Element betreffen. Zum Beispiel ist das Hinzufügen von zehn Zeilen mit einem einzigen QBarDataProxy::addRows()-Aufruf viel effizienter als zehn separate QBarDataProxy::addRow()-Aufrufe.
Bars3D ist so optimiert, dass nur auf Daten zugegriffen wird, die sich innerhalb des Datenfensters befinden, und sollte daher auch dann nicht merklich langsamer werden, wenn der Reihe mithilfe des Proxys kontinuierlich weitere Daten hinzugefügt werden.
Aufgrund des unsortierten Charakters der Streudaten müssen bei jeder Änderung der Datenfensterbereiche alle Datenpunkte auf Sichtbarkeit geprüft werden, was zu einer zunehmenden Verlangsamung führen kann, wenn dem Proxy kontinuierlich Daten hinzugefügt werden. Um die beste Leistung mit den Streudiagrammen zu erzielen, sollten Sie nur die Daten im Proxy behalten, die Sie benötigen.
Oberflächendaten sind zwar auf der Elementebene ähnlich wie Streuungsdaten, werden aber bereits in Zeilen und Spalten zugewiesen. Daher kann der Oberflächen-Renderer das Zeichnen optimieren, indem er davon ausgeht, dass die Daten in den Zeilen und Spalten entlang ihrer jeweiligen Achsen sortiert sind. Das ist nicht ganz so effizient wie bei den Balken, aber fast.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.