Auf dieser Seite

Qt Data Visualization Datenverarbeitung

Reihen

Eine Serie ist eine Kombination aus einer logisch verbundenen Menge von Datenelementen (die von einem Datenproxy verwaltet werden) und visuellen Eigenschaften, die beschreiben, wie die Datenelemente dargestellt werden sollen, beispielsweise Elementgitter und Farben. Jeder Visualisierungstyp verfügt über einen eigenen Serientyp. Beispielsweise verwenden Balkendiagramme QBar3DSeries. Allen Diagrammen können gleichzeitig mehrere Serien hinzugefügt werden.

Dieser Codeausschnitt zeigt, wie man mit QBar3DSeries Balken als Zylinder und mit einem Farbverlauf anstelle einer einheitlichen Farbe darstellt:

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);

Datenproxys

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 “ Datenproxys, in die Benutzer ihre Daten in einem bekannten Format einspeisen können. Jeder Visualisierungstyp verfügt über einen Basis-Proxy-Typ, der Daten in einem für diese Visualisierung geeigneten Format entgegennimmt. Der Basis-Proxy für `QBar3DSeries` ist beispielsweise `QBarDataProxy`, der Zeilen von `QBarDataItem`-Objekten speichert. Jedes `QBarDataItem` speichert einen einzelnen Balkenwert. Für Container vom Typ ` QBarDataArray ` und ` QBarDataRow ` werden zusätzliche `typedef`s bereitgestellt.

Dieser Codeausschnitt zeigt, wie man den Basis-Proxy verwendet, wenn Ihre 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 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 einem Proxy jedes Mal neu zu setzen, wenn Sie wechseln müssen.

Elementmodelle und Datenzuordnung

Für gängige Anwendungsfälle bietet „ Qt Data Visualization “ spezielle Proxys an. Ein solcher Fall ist die Verwendung von Daten in einem Elementmodell (Unterklasse von `QAbstractItemModel `), was eine gängige Methode zum Speichern von Daten in Qt-Anwendungen ist. Jeder Visualisierungstyp bietet zu diesem Zweck eine spezielle Proxy-Klasse, zum Beispiel „QItemModelBarDataProxy“ für „QBar3DSeries“. Diese Proxys sind einfach zu verwenden: Man übergibt ihnen lediglich einen Zeiger auf das Item-Modell, das die Daten enthält, sowie die Regeln, nach denen die Daten in ein Format gemappt 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 zur Bestimmung der Zeile verwendet wird, zu der das Element gehört, welche Rolle dies für Spalten übernimmt und welche Rolle den Wert des Elements angibt. Wenn der Proxy die Daten aus dem Modell auflöst, nutzt er diese Zuordnungen, um die Zeilen und Spalten des Balkendiagramms zu generieren.

Häufig verfügen die 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, stellen Elementmodell-Proxys einen Mechanismus zum Musterabgleich und zum Ersetzen bereit. Sie können diesen Mechanismus auch nutzen, um Daten selbst bei einer Eins-zu-Eins-Zuordnung neu zu formatieren.

Je nach Visualisierungstyp können Proxys auch weitere Funktionen unterstützen, wie beispielsweise den QItemModelBarDataProxy, der optional die Zeilen und Spalten von „ QAbstractItemModel “ direkt auf die Zeilen und Spalten des Balkendiagramms abbildet.

Weitere Informationen und Beispiele zur Verwendung der einzelnen Proxy-Klassen finden Sie unter: QItemModelBarDataProxy, QItemModelScatterDataProxy und QItemModelSurfaceDataProxy.

Andere benutzerdefinierte Proxys

QHeightMapSurfaceDataProxy ist ein spezialisierter Proxy zur Erzeugung eines Flächendiagramms aus einem Höhenkartenbild. Weitere Informationen finden Sie in der Dokumentation zu QHeightMapSurfaceDataProxy.

Das Beispiel „Graph Gallery“ zeigt unter der Registerkarte „ Bar Graph “, 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 ü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 Aufbau des Arrays zu vermeiden, das dem Proxy übergeben wird. 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 für jeden Frame mehrere Zeilen oder Elemente 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()`.

Der Balken-Renderer ist so optimiert, dass er nur auf Daten zugreift, die sich innerhalb des Datenfensters befinden, und sollte daher keine spürbaren Verlangsamungen aufweisen, selbst wenn dem Proxy kontinuierlich weitere Daten hinzugefügt werden.

Da die Streudiagrammdaten unsortiert sind, erfordert jede Änderung der Bereiche im Datenfenster eine Überprüfung aller Datenpunkte auf Sichtbarkeit, was zu zunehmenden Verzögerungen 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 Streudiagrammdaten vergleichbar, sind jedoch bereits in Zeilen und Spalten angeordnet, sodass der Oberflächendarsteller die Darstellung optimieren kann, 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.