Qt Data Visualization 是一个开源的第三方库,它为Qt框架提供了高级的数据可视化功能。这个库允许开发者创建复杂的3D和2D图表,包括但不限于散点图、曲面图、条形图等。它基于Qt 3D模块,因此可以充分利用Qt 3D引擎的强大功能来呈现三维数据。
一、安装
要在你的Qt项目中包含Qt Data Visualization,你首先需要确保你的Qt安装中包含了Qt Data Visualization模块。你可以通过Qt的维护工具(如Qt Maintenance Tool)来安装或更新模块。
安装步骤:
-
打开Qt Maintenance Tool:
-
如果你使用的是Windows,通常在安装目录下的
maintenance
文件夹中。 -
在Mac上,通常在
/Applications/Qt/
目录下。 -
在Linux上,通常在
/opt/qtcreator/
或你的家目录下的某个Qt文件夹中。
-
-
选择“Add or Remove Components”:
-
在维护工具中,选择“Add or Remove Components”选项。
-
-
安装Qt Data Visualization:
-
在组件列表中,找到“Qt Data Visualization”模块,并勾选它。
-
根据提示完成安装过程。
-
二、配置
- 模块引入
在.pro
文件中添加模块依赖:QT += datavisualization
- 头文件包含
C++ 中需包含头文件:#include <QtDataVisualization> using namespace QtDataVisualization;
三、核心类与创建流程
-
选择图表类型
- Q3DBars:三维柱状图,适用于多组数据对比14
- Q3DScatter:三维散点图,适合点云或分布数据展示23
- Q3DSurface:三维曲面图,用于显示连续数据或地形23
-
创建图表对象
Q3DBars bars; // 柱状图 Q3DSurface surface; // 曲面图
-
设置容器窗口
不能简单使用QWidget组件作为Q3DBars组件的容器,也就是不能在主窗口上放置一个QWidget组件,然后作为Q3DBars组件的容器,需通过QWidget::createWindowContainer
将图表嵌入容器:QWidget *container = QWidget::createWindowContainer(&bars);
-
调整窗口标志
去除默认的无边框窗口标志以正确显示:bars.setFlags(bars.flags() ^ Qt::FramelessWindowHint);
四、数据与系列配置
数据序列(Series)
- 柱状图:使用
QBar3DSeries
,通过dataProxy()->addRow()
添加数据QBar3DSeries *series = new QBar3DSeries; QBarDataRow *dataRow = new QBarDataRow; *dataRow << 1.0f << 3.0f << 7.5f; series->dataProxy()->addRow(dataRow); bars.addSeries(series);
- 曲面图:使用
QSurface3DSeries
,通过resetArray()
加载数据QSurfaceDataArray *data = new QSurfaceDataArray; QSurfaceDataRow *row1 = new QSurfaceDataRow; *row1 << QVector3D(0, 0.1, 0.5) << QVector3D(1, 0.5, 0.5); data->append(row1); QSurface3DSeries *series = new QSurface3DSeries; series->dataProxy()->resetArray(data); surface.addSeries(series);
坐标轴设置
bars.rowAxis()->setRange(0, 4); // 行轴范围
bars.columnAxis()->setRange(0, 4); // 列轴范围
bars.valueAxis()->setLabelFormat("%.2f"); // 数值轴格式
五、示例代码
1、代码(以曲面图为例)
#include <QApplication>
#include <QtDataVisualization>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建 Q3DSurface 对象QtDataVisualization::Q3DSurface surface;surface.setFlags(surface.flags() ^ Qt::FramelessWindowHint); // 移除窗口边框 surface.setWidth(800);surface.setHeight(600);// 创建数据代理和序列QtDataVisualization::QSurfaceDataProxy *proxy = new QtDataVisualization::QSurfaceDataProxy();QtDataVisualization::QSurface3DSeries *series = new QtDataVisualization::QSurface3DSeries(proxy);// 配置序列绘制模式series->setDrawMode(QtDataVisualization::QSurface3DSeries::DrawSurface); // 绘制曲面 series->setFlatShadingEnabled(true); // 启用平滑着色// 填充数据(示例:2x2 矩阵)QtDataVisualization::QSurfaceDataArray *data = new QtDataVisualization::QSurfaceDataArray;QtDataVisualization::QSurfaceDataRow *row1 = new QtDataVisualization::QSurfaceDataRow;QtDataVisualization::QSurfaceDataRow *row2 = new QtDataVisualization::QSurfaceDataRow;*row1 << QVector3D(0, 0, 1) << QVector3D(1, 0, 2);*row2 << QVector3D(0, 1, 3) << QVector3D(1, 1, 4);data->append(row1);data->append(row2);// 将数据绑定到代理proxy->resetArray(data); // 将序列添加到曲面对象surface.addSeries(series);surface.show();return app.exec();
}
2、代码(3D散点图)
#include <QtDataVisualization>
#include <QApplication>
#include <QSurface3DSeries>
#include <Q3DBars>
#include <QScatter3DSeries>
#include <QScatterDataItem>
#include <QScatterDataProxy>
#include <QRandomGenerator>using namespace QtDataVisualization;int main(int argc, char **argv) {QApplication app(argc, argv);Q3DBars *graph = new Q3DBars();graph->activeTheme()->setType(Q3DTheme::Theme(Q3DTheme::ThemeUberDark));graph->activeTheme()->setBackgroundEnabled(false);graph->activeTheme()->setGridEnabled(false);graph->activeTheme()->setLabelBackgroundEnabled(false);graph->activeTheme()->setLabelBorderEnabled(false);graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);graph->axisX()->setTitle("X Axis");graph->axisY()->setTitle("Y Axis");graph->axisZ()->setTitle("Z Axis");graph->show();return app.exec();
}
五、第三方扩展组件
QtDataVisualization三维图表适合轻量级数据(如千级数据点),复杂场景建议使用 VTK 等专业库。
VTK(Visualization Toolkit)是一个开源的、跨平台的三维可视化开发库,用于处理和可视化三维数据。
1、编译
从网址:Download | VTK下载源码编译。
- 下载 VTK 8.2.0 源码(Windows 选
.zip
格式),解压至本地路径 - 使用 CMake 生成 VS 项目:
- 设置
BUILD_SHARED_LIBS=ON
(动态编译) - 勾选
VTK_GROUP_Qt
以支持 Qt 集成 - 指定
CMAKE_INSTALL_PREFIX
为安装路径(如D:/VTK
)
- 设置
- 使用 Visual Studio 编译
ALL_BUILD
和INSTALL
生成库文件
2、QT配置
在 .pro
文件中添加 VTK 路径:
INCLUDEPATH += D:/VTK/include/vtk-8.2
LIBS += -LD:/VTK/lib -lvtkCommonCore-8.2 -lvtkRenderingOpenGL2-8.2 # 根据需求添加其他库
将 QVTKOpenGLNativeWidget
控件类提升到 Qt UI 界面中,在 Qt Designer 中添加 QWidget
,右键选择「提升为」并填写类名 QVTKOpenGLNativeWidget
。
3、核心开发步骤
1)初始化 VTK 窗口
#include <QVTKOpenGLNativeWidget.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>QVTKOpenGLNativeWidget *vtkWidget = new QVTKOpenGLNativeWidget(this);
vtkNew<vtkRenderer> renderer;
vtkWidget->renderWindow()->AddRenderer(renderer);// 创建球体并显示
vtkNew<vtkSphereSource> sphere;
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(sphere->GetOutputPort());
vtkNew<vtkActor> actor;
actor->SetMapper(mapper);
renderer->AddActor(actor);
2)加载 STL 模型
#include <vtkSTLReader.h>
vtkNew<vtkSTLReader> reader;
reader->SetFileName("model.stl");
reader->Update();
mapper->SetInputConnection(reader->GetOutputPort()); // 替换上述球体代码
具体编译与使用步骤参考:VTK 8.2.0编译与配置 - 懒蚂蚁呀不嘿 - 博客园