Qt三维图表模块 —– Data Visualization
Qt数据可视化模块提供了一种将三维图形中的数据可视化为条形图、散点图和曲面图的方法。它对于可视化深度图和大量快速变化的数据特别有用,如从多个传感器接收到的数据。图形的外观和感觉可以通过使用主题或添加自定义项目和标签来定制。
Qt数据可视化建立在Qt5和OpenGL上,以利用硬件加速和QtQuick2。
如果打算在应用程序中使用Qt数据可视化C++类,请使用以下包括和使用指令:
#include <QtDataVisualization>
using namespace QtDataVisualization;
如果只使用这个模块中的几个类,建议只包括这些特定的类,而不是整个模块。
要链接到Qt数据可视化模块,请将这行添加到qmake项目文件中:
QT += datavisualization
使用说明:
三维柱状图 Q3DBars
图表:
序列:QBar3DSeries
坐标轴:QValue3DAxis 数值型坐标轴,
QCategory3DAxis 文字型坐标轴
数据代理类:QBarDataProxy类是三维条形图的数据代理。条形图数据代理处理添加、插入、更改和删除数据行。数据数组是QBarDataItem实例的向量(行)列表。每一行可以包含不同数量的项,甚至可以为空。QBarDataProxy获取传递给它的所有QtDataVisualization::QBarDataRow对象的所有权,无论是直接的还是在QtDataVisualization::QBarDataArray容器中。如果在将数组添加到代理服务器后,使用条形数据行指针直接修改数据,则必须发出适当的信号来更新图。
QBarDataProxy可以选择跟踪行和列标签,Q类3DAxis可以利用这些标签来显示轴标签。行和列标签与数据分别存储在一个单独的数组中,而行操作方法提供了不影响行标签的替代版本。这就可以选择使用与数组中数据的位置相关,而不是与数据本身相关的行标签。
一个图中可以有多个同系列的序列,但不能有不同类型的序列。
示例:
#include <QtDataVisualization>
using namespace QtDataVisualization;
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
//首先,构造一个Q3DBars的实例。由于在本例中将图作为顶级窗口运行,需要清除Qt::帧窗口Hint标志,默认设置:
Q3DBars bars;
bars.setFlags(bars.flags() ^ Qt::FramelessWindowHint);
// //设置坐标轴的显示范围
bars.rowAxis()->setRange(0, 4);
bars.columnAxis()->setRange(0, 4);
//创建5行数据,放入序列,添加到图形
QBar3DSeries *series = new QBar3DSeries;
QBarDataRow *data = new QBarDataRow;
*data << 1.0f << 3.0f << 7.5f << 5.0f << 2.2f;
series->dataProxy()->addRow(data);
bars.addSeries(series);
bars.show();
return app.exec();
}
三维散点图 Q3DScatter:
图表:
序列:QScatter3DSeries
坐标轴:QValue3DAxis 数值型坐标轴,
QCategory3DAxis 文字型坐标轴
数据代理类:与序列对应用于存储序列的数据的类
QScatterDataProxy
一个图中可以有多个同系列的序列,但不能有不同类型的序列。
示例:
#include <QtDataVisualization>
using namespace QtDataVisualization;
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
Q3DScatter scatter;
scatter.setFlags(scatter.flags() ^ Qt::FramelessWindowHint);
QScatter3DSeries *series = new QScatter3DSeries;
QScatterDataArray data;
data << QVector3D(0.5f, 0.5f, 0.5f) << QVector3D(-0.3f, -0.5f, -0.4f) << QVector3D(0.0f, -0.3f, 0.2f);
series->dataProxy()->addItems(data);
scatter.addSeries(series);
scatter.show();
return app.exec();
}
三维曲面 Q3DSurface
图表:
序列:QSurface3DSeries
坐标轴:QValue3DAxis 数值型坐标轴,
QCategory3DAxis 文字型坐标轴
数据代理类:与序列对应用于存储序列的数据的类
QSurfaceDataProxy
一个图中可以有多个同系列的序列,但不能有不同类型的序列。
#include <QtDataVisualization>
using namespace QtDataVisualization;
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
Q3DSurface surface;
surface.setFlags(surface.flags() ^ Qt::FramelessWindowHint);
QSurfaceDataArray *data = new QSurfaceDataArray;
QSurfaceDataRow *dataRow1 = new QSurfaceDataRow;
QSurfaceDataRow *dataRow2 = new QSurfaceDataRow;
*dataRow1 << QVector3D(0.0f, 0.1f, 0.5f) << QVector3D(1.0f, 0.5f, 0.5f);
*dataRow2 << QVector3D(0.0f, 1.8f, 1.0f) << QVector3D(1.0f, 1.2f, 1.0f);
*data << dataRow1 << dataRow2;
QSurface3DSeries *series = new QSurface3DSeries;
series->dataProxy()->resetArray(data);
surface.addSeries(series);
surface.show();
return app.exec();
}