Qt Graphs Datenverarbeitung mit 3D
Serien
Eine Reihe kombiniert eine logisch zusammenhängende Menge von Datenelementen mit visuellen Eigenschaften, die beschreiben, wie die Datenelemente dargestellt werden sollen, beispielsweise Elementgitter und Farben. Jeder Diagrammtyp verfügt über einen eigenen Reihen-Typ. Beispielsweise verwenden Balkendiagramme „ QBar3DSeries “. Allen Diagrammen können gleichzeitig mehrere Reihen hinzugefügt werden. Jede Reihe verfügt über eigene Daten.
Dieser Codeausschnitt zeigt, wie man mit ` QBar3DSeries ` Balken als Zylinder und mit einem Farbverlauf anstelle einer einheitlichen Farbe darstellt:
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);Datenproxys
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 “ Datenproxies, in die Benutzer ihre Daten in einem bekannten Format einspeisen können. Jedes Diagramm verfügt in seinen Reihen über einen grundlegenden Proxy-Typ, der Daten in einem für dieses Diagramm geeigneten Format entgegennimmt. Da die Daten im Rahmen der Beziehung zwischen Proxy und Reihe in Reihen gespeichert werden, ist es wichtig, einige Punkte zu erwähnen. Erstens können Nutzer bei dieser Implementierung über die Reihen auf Daten zugreifen. Wenn ein Nutzer Operationen an diesen Daten durchführen möchte, wie z. B. Hinzufügen oder Entfernen, kann er diese Operationen weiterhin über den Proxy ausführen. Um diese Operationen durchzuführen, ist es jedoch erforderlich, eine mit diesem Proxy verknüpfte Reihe anzulegen.
Beispielsweise lautet der Basis-Proxy für QBar3DSeries „ QBarDataProxy “, der dazu dient, Daten als „ QBarDataItem “-Objekte zur Serie hinzuzufügen. Jedes „ QBarDataItem “-Objekt enthält einen einzelnen Balkenwert. Für die Container „ QBarDataArray “ und „ QBarDataRow “ stehen zusätzliche Typdefinitionen zur Verfügung.
Dieser Codeausschnitt zeigt, wie man einen einfachen Proxy verwendet, 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 der Serie ein anderer zugewiesen 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 Datensatz in einer eigenen Serie zu speichern und einfach die Serie zu wechseln, anstatt die Daten in der Serie bei jedem Wechsel mithilfe eines Proxys zurückzusetzen.
Elementmodelle und Datenzuordnung
Für gängige Anwendungsfälle bietet „ Qt Graphs “ spezielle Proxys an. Ein solcher Fall ist die Speicherung von Daten in einem Item-Modell (Unterklasse von „QAbstractItemModel “), was eine gängige Methode zur Datenspeicherung in Qt-Anwendungen ist. Jeder Typ des Graphen bietet zu diesem Zweck eine spezielle Proxy-Klasse, zum Beispiel „ QItemModelBarDataProxy “ für „ QBar3DSeries “. Diese Proxys sind einfach zu verwenden: Man übergibt ihnen einen Zeiger auf das Item-Modell, das die Daten enthält, und legt die Regeln fest, wie die Daten in ein Format abgebildet werden sollen, das der Basis-Proxy verarbeiten kann.
Die Zuordnung erfolgt über die Rollen des Item-Modells. Jedes Datenelement im Modell kann für verschiedene Rollen unterschiedliche Werte annehmen. Mit QItemModelBarDataProxy können Sie beispielsweise festlegen, welche Rolle verwendet wird, um zu bestimmen, zu welcher Zeile das Element gehört, welche Rolle dasselbe 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 generieren.
Häufig verfügen Elementmodelle über 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, beispielsweise Jahren und Monaten. Um die Zuordnung einer einzelnen Rolle eines Elementmodells zu mehr als einem Datenfeld zu ermöglichen, sollten Elementmodell-Proxys einen Mechanismus zum Musterabgleich und -ersetzen implementieren. Sie können diesen Mechanismus auch nutzen, um Daten selbst bei einer Eins-zu-Eins-Zuordnung neu zu formatieren.
Je nach Diagrammtyp können Proxies auch weitere Funktionen unterstützen, wie beispielsweise die optionale Zuordnung von Zeilen und Spalten aus „ QItemModelBarDataProxy “ direkt zu den Zeilen und Spalten eines Balkendiagramms unter QAbstractItemModel.
Weitere Informationen und Beispiele zur Verwendung finden Sie in den einzelnen Proxy-Klassen: QItemModelBarDataProxy, QItemModelScatterDataProxy und QItemModelSurfaceDataProxy.
Andere benutzerdefinierte Proxies
QHeightMapSurfaceDataProxy ist ein spezieller Proxy zur Erzeugung eines Oberflächendiagramms aus einem Höhenkartenbild. Weitere Informationen finden Sie in der Dokumentation zu „ QHeightMapSurfaceDataProxy “.
Das Beispiel „Graph Gallery“ auf der Registerkarte „ Bar Graph “ zeigt, wie ein benutzerdefinierter Proxy erstellt werden kann. Es definiert einen benutzerdefinierten Datensatz auf Basis von Variantenlisten sowie eine Erweiterung des Basis-Proxys, um diese Daten mit einem zugehörigen Mapper aufzulösen.
Umgang mit Echtzeitdaten
Wenn Sie über einen Datensatz verfügen, der sich schnell aktualisiert, ist es wichtig, die Daten ordnungsgemäß zu verarbeiten, um eine gute Leistung zu gewährleisten. Da die Speicherzuweisung ein ressourcenintensiver Vorgang ist, sollten Sie nach Möglichkeit immer „ QList::reserve()“ und „ QList::resize()“ verwenden, um unnötige Neuzuweisungen beim Erstellen des Arrays für den Proxy zu vermeiden.
Wenn Sie
- den gesamten Datensatz für jedes Bild ändern müssen, ist es in den meisten Fällen am besten, das vorhandene Array wiederzuverwenden, insbesondere wenn sich die Array-Dimensionen nicht ändern.
- mehrere Zeilen oder Elemente pro Frame hinzufügen, einfügen, entfernen oder ändern müssen, ist es immer effizienter, dies mit einem einzigen Methodenaufruf zu tun, anstatt mehrere Aufrufe zu verwenden, die jeweils nur eine einzelne Zeile oder ein einzelnes Element betreffen. Beispielsweise ist das Hinzufügen von zehn Zeilen mit einem einzigen Aufruf von ` QBarDataProxy::addRows()` wesentlich effizienter als zehn separate Aufrufe von ` QBarDataProxy::addRow()`.
Bars3D ist so optimiert, dass nur auf Daten zugegriffen wird, die sich innerhalb des Datenfensters befinden, und sollte daher keine spürbare Verlangsamung erfahren, selbst wenn der Reihe über den Proxy kontinuierlich weitere Daten hinzugefügt werden.
Da die Streudiagrammdaten unsortiert sind, erfordert jede Änderung der Bereiche im Datenfenster, dass alle Datenpunkte auf Sichtbarkeit überprüft werden, was zu einer zunehmenden Verlangsamung führen kann, wenn dem Proxy kontinuierlich Daten hinzugefügt werden. Um die beste Leistung bei Streudiagrammen zu erzielen, sollten Sie nur die Daten, die Sie benötigen, im Proxy behalten.
Oberflächendaten sind zwar auf Elementebene mit Streudaten vergleichbar, sind jedoch bereits in Zeilen und Spalten angeordnet. 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. Dies ist nicht ganz so effizient wie bei Balkendiagrammen, kommt diesem Ergebnis jedoch sehr nahe.
© 2026 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.