Qt Data Visualization Datenverarbeitung
Serie
Eine Serie ist eine Kombination aus einem logisch zusammenhängenden Satz von Datenelementen (die von einem Daten-Proxy verarbeitet werden) und visuellen Eigenschaften, die beschreiben, wie die Datenelemente gerendert werden sollen, wie z. B. Elementnetze und Farben. Jeder Visualisierungstyp hat seinen eigenen Serientyp. Balkendiagramme zum Beispiel verwenden QBar3DSeries. Zu allen Diagrammen können mehrere Serien gleichzeitig hinzugefügt werden.
Dieses Codeschnipsel zeigt, wie man QBar3DSeries verwendet, um Balken als Zylinder und mit einem Farbverlauf anstelle einer einheitlichen Farbe darzustellen:
Q3DBars graph; QBar3DSeries *series = new QBar3DSeries; QLinearGradient barGradient(0, 0, 1, 100); barGradient.setColorAt(1.0, Qt::white); barGradient.setColorAt(0.0, Qt::black); series->setBaseGradient(barGradient); series->setColorStyle(Q3DTheme::ColorStyleObjectGradient); series->setMesh(QAbstract3DSeries::MeshCylinder); graph->addSeries(series);
Daten Proxies
Die Daten, die Benutzer visualisieren möchten, liegen in vielen Formaten vor, die natürlich nicht alle direkt unterstützt werden können. Daher implementiert Qt Data Visualization Daten-Proxies, in die der Benutzer seine Daten in einem bekannten Format einspeisen kann. Jeder Visualisierungstyp hat einen Basis-Proxy-Typ, der Daten in einem für diese Visualisierung geeigneten Format entgegennimmt. Der Basis-Proxy für QBar3DSeries ist zum Beispiel QBarDataProxy, der Zeilen von QBarDataItem Objekten speichert. Jedes QBarDataItem speichert einen einzelnen Balkenwert. Zusätzliche Typendefinitionen werden für die Container QBarDataArray
und QBarDataRow
bereitgestellt.
Dieser Codeschnipsel zeigt, wie man Basic Proxy verwendet, wenn die Daten in einem hypothetischen myData
Objekt gespeichert sind:
Q3DBars graph; QBarDataProxy *newProxy = new QBarDataProxy; QBarDataArray *dataArray = new QBarDataArray; dataArray->reserve(10); for (int i = 0; i < 10; i++) { QBarDataRow *dataRow = new QBarDataRow(5); for (int j = 0; j < 5; j++) (*dataRow)[j].setValue(myData->getValue(i, j)); dataArray->append(dataRow); } newProxy->resetArray(dataArray); graph->addSeries(new QBar3DSeries(newProxy));
Hinweis: Serienobjekte können jeweils nur einen einzigen Proxy besitzen. Der vorhandene Proxy wird gelöscht, wenn ein anderer auf die Serie gesetzt 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, als die Daten in einem Proxy jedes Mal zurückzusetzen, wenn Sie wechseln müssen.
Elementmodelle und Datenmapping
Für häufige Anwendungsfälle bietet Qt Data Visualization spezielle Proxys. Ein solcher Fall ist die Speicherung von Daten in einem Item Model (QAbstractItemModel subclass), eine gängige Methode zur Speicherung von Daten in Qt-Anwendungen. Jeder der Visualisierungstypen bietet eine spezielle Proxy-Klasse für diesen Zweck, zum Beispiel QItemModelBarDataProxy für QBar3DSeries. Diese Proxies sind einfach zu benutzen: man muss ihnen nur einen Zeiger auf das Elementmodell geben, das die Daten enthält, und die Regeln, 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 Artikelmodellrolle zu mehr als einem Datenfeld zu ermöglichen, bieten Artikelmodell-Proxys einen Mechanismus zum Abgleichen und Ersetzen von Mustern. Sie können diesen Mechanismus auch nutzen, um Daten umzuformatieren, selbst wenn es sich um eine Eins-zu-eins-Zuordnung handelt.
Je nach Visualisierungstyp können Proxys auch andere Funktionalitäten unterstützen, wie z. B. QItemModelBarDataProxy, das optional Zeilen und Spalten von QAbstractItemModel direkt in 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 zeigt, wie ein benutzerdefinierter Proxy erstellt werden kann, und zwar auf der Registerkarte Bar Graph. Es definiert einen benutzerdefinierten Datensatz auf Basis 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 ein kostspieliger Vorgang 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 an den Proxy übergeben. Wenn Sie den gesamten Datensatz für jeden Frame ändern müssen, ist es in den meisten Fällen am besten, das vorhandene Array wiederzuverwenden - insbesondere wenn sich die Array-Dimensionen nicht ändern. Wenn Sie mehrere Zeilen oder Elemente für jeden Frame hinzufügen, einfügen, entfernen oder ändern müssen, ist es immer effizienter, dies mit einem Methodenaufruf zu tun, als mit mehreren Aufrufen, die jeweils eine einzelne Zeile oder ein 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.
Der Bars-Renderer ist so optimiert, dass er nur auf Daten zugreift, die sich innerhalb des Datenfensters befinden, und sollte daher nicht merklich verlangsamt werden, selbst wenn dem Proxy ständig weitere Daten hinzugefügt werden.
Aufgrund des unsortierten Charakters der Streudaten müssen bei jeder Änderung der Datenfensterbereiche alle Datenpunkte auf ihre Sichtbarkeit überprü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 Elementebene ähnlich wie Streudaten, aber sie sind bereits in Zeilen und Spalten eingeteilt, so dass der Oberflächenrenderer das Zeichnen optimieren kann, 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.