Qt Data Visualization 数据处理

系列

系列是一组逻辑上相连的数据项(由数据代理处理)与描述如何呈现数据项的可视化属性(如项目网格和颜色)的组合。每种可视化类型都有自己的系列类型。例如,条形图使用QBar3DSeries 。所有图形都可以同时添加多个系列。

本代码片段展示了如何使用QBar3DSeries 将条形图呈现为圆柱体,并使用渐变色而不是统一颜色:

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

数据代理

用户希望可视化的数据有多种格式,显然无法直接支持所有格式。因此,Qt Data Visualization 实现了数据代理,用户可以将已知格式的数据输入其中。每种可视化类型都有一个基本代理类型,它以适合该可视化类型的格式接收数据。例如,QBar3DSeries 的基本代理是QBarDataProxy ,它存储QBarDataItem 对象的行。每个QBarDataItem 存储一个条形图值。还为QBarDataArrayQBarDataRow 容器提供了其他类型定义。

本代码片段展示了当数据存储在某个假设的myData 对象中时,如何使用基本代理:

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

注意: 系列对象一次只能拥有一个代理。当为系列设置另一个代理时,现有代理将被删除。不过,图表可以包含多个系列。如果需要在两组不同的数据之间来回切换,通常更有效的做法是将每组数据存储在不同的系列中,然后更改系列,而不是每次需要切换时都重置一个代理中的数据。

项目模型和数据映射

对于常见的使用情况,Qt Data Visualization 提供了专门的代理。其中一种情况是在项目模型(QAbstractItemModel 子类)中拥有数据,这是 Qt XML 应用程序中存储数据的常见方式。每种可视化类型都为此提供了一个特殊的代理类,例如QItemModelBarDataProxy 用于QBar3DSeries 。这些代理使用起来很简单:只需给它们一个指向包含数据的项目模型的指针,以及如何将数据映射为基本代理可以消化的格式的规则即可。

映射使用项目模型角色。模型中的每个数据项可以为不同的角色提供不同的值。例如,通过QItemModelBarDataProxy ,您可以指定哪个角色用于确定项属于哪一行,哪个角色用于确定列,哪个角色用于指定项的值。当代理从模型中解析数据时,它会使用这些映射来生成条形图的行和列。

通常情况下,项目模型会有一个单一角色,其中包含的信息需要映射到多个值。一个典型的例子就是在生成具有两个时间相关轴(如年和月)的条形图时使用时间戳字段。为了将单个项目模型角色映射到多个数据字段,项目模型代理提供了模式匹配和替换机制。即使在一对一映射的情况下,您也可以使用这种机制来重新格式化数据。

根据可视化类型的不同,代理可能还支持其他功能,例如QItemModelBarDataProxy 可选择将QAbstractItemModel 行和列直接映射为条形图行和列。

有关如何使用代理的更多信息和示例,请参见各个代理类:QItemModelBarDataProxyQItemModelScatterDataProxyQItemModelSurfaceDataProxy

其他自定义代理

QHeightMapSurfaceDataProxy 是一个专门的代理,用于从高度图图像生成曲面图。更多信息,请参阅 文档。QHeightMapSurfaceDataProxy

图库示例展示了如何在Bar Graph 选项卡下创建自定义代理。该示例定义了基于变体列表的自定义数据集,以及基本代理的扩展,以便使用相关映射器解析该数据。

处理实时数据

当数据集更新较快时,必须正确处理数据以确保良好的性能。由于内存分配是一项代价高昂的操作,因此在向代理提供数组时,应尽可能使用QList::reserve() 和QList::resize() 来避免不必要的重新分配。如果需要为每一帧更改整个数据集,在大多数情况下最好重复使用现有数组,尤其是在数组维数不变的情况下。如果需要为每一帧添加、插入、移除或更改几行或几项数据,则调用一个方法比调用多个方法更有效。例如,通过一次QBarDataProxy::addRows() 调用添加十行比通过十次单独的QBarDataProxy::addRow() 调用效率要高得多。

Bars 渲染器经过优化,只能访问数据窗口内的数据,因此即使代理中不断添加更多数据,速度也不会明显减慢。

由于散点图数据未排序的特性,数据窗口范围的任何变化都需要检查所有数据点的可见性,如果数据不断添加到代理中,可能会导致速度越来越慢。要想获得散点图的最佳性能,只需在代理中保留所需的数据。

曲面数据虽然在项目级别上与散点图数据类似,但已被分配到行和列中,因此曲面渲染器可以通过假设行和列中的数据已沿着各自的坐标轴排序来优化绘制。虽然效率不如条形图,但也差不多了。

© 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.