欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > QtDataVisualization使用

QtDataVisualization使用

2025/3/13 22:19:14 来源:https://blog.csdn.net/byxdaz/article/details/146202413  浏览:    关键词:QtDataVisualization使用

Qt Data Visualization 是一个开源的第三方库,它为Qt框架提供了高级的数据可视化功能。这个库允许开发者创建复杂的3D和2D图表,包括但不限于散点图、曲面图、条形图等。它基于Qt 3D模块,因此可以充分利用Qt 3D引擎的强大功能来呈现三维数据。

一、安装

要在你的Qt项目中包含Qt Data Visualization,你首先需要确保你的Qt安装中包含了Qt Data Visualization模块。你可以通过Qt的维护工具(如Qt Maintenance Tool)来安装或更新模块。

安装步骤:
  1. 打开Qt Maintenance Tool

    • 如果你使用的是Windows,通常在安装目录下的maintenance文件夹中。

    • 在Mac上,通常在/Applications/Qt/目录下。

    • 在Linux上,通常在/opt/qtcreator/或你的家目录下的某个Qt文件夹中。

  2. 选择“Add or Remove Components”

    • 在维护工具中,选择“Add or Remove Components”选项。

  3. 安装Qt Data Visualization

    • 在组件列表中,找到“Qt Data Visualization”模块,并勾选它。

    • 根据提示完成安装过程。

二、配置

  1. 模块引入
    在 .pro 文件中添加模块依赖:
    QT += datavisualization
  2. 头文件包含
    C++ 中需包含头文件:
    #include <QtDataVisualization>
    using namespace QtDataVisualization;

三、核心类与创建流程

  1. 选择图表类型

    • Q3DBars‌:三维柱状图,适用于多组数据对比‌14
    • Q3DScatter‌:三维散点图,适合点云或分布数据展示‌23
    • Q3DSurface‌:三维曲面图,用于显示连续数据或地形‌23
  2. 创建图表对象

    Q3DBars bars;  // 柱状图
    Q3DSurface surface; // 曲面图
  3. 设置容器窗口
    不能简单使用QWidget组件作为Q3DBars组件的容器,也就是不能在主窗口上放置一个QWidget组件,然后作为Q3DBars组件的容器,需通过 QWidget::createWindowContainer 将图表嵌入容器:

    QWidget *container = QWidget::createWindowContainer(&bars);
  4. 调整窗口标志
    去除默认的无边框窗口标志以正确显示:

    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编译与配置 - 懒蚂蚁呀不嘿 - 博客园

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词