当前位置: 首页 > news >正文

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

相关文章:

  • 100.Vue3 + OpenLayers:使用 marker-feature 添加 Marker
  • linux基本操作系统2
  • How to install a package in offline scenario in Ubuntu 24.04
  • bean的加载过程
  • WPF从初学者到专家:实战项目经验分享与总结
  • Gymnasium Taxi‐v3 环境 与 Q-learning 算法 —— 强化学习入门 I
  • 2min搞定~Mac Pro 编译安装 Nginx 1.8.1
  • IP地址到地理地址查询的实现逻辑
  • 【Go】字符串相关知识点
  • ranger集成starrock报错
  • CTFshow 【WEB入门】信息搜集 【VIP限免】 web1-web17
  • 【第四节】windows sdk编程:windows 中的窗口
  • 隐藏的git文件夹
  • 【解决报错】:detected dubious ownership in repository at ‘D:/idea_code/xxx‘问题
  • 每日一题——两两交换链表中的节点
  • koltin在android 开发
  • 微电网管理 实现分布式能源的智能调度和管理
  • 【Java】并发编程实战:单例模式 + 阻塞队列的终极实现指南
  • 系统化战略管理国产软件的开创者与引领者
  • 【结构光相机的精度极限】
  • 外媒:哈马斯一名高级指挥官尸体被发现,系辛瓦尔弟弟
  • 美国失去最后一个AAA评级,资产价格怎么走?美股或将触及天花板
  • 上海:到2027年,实现近海航线及重点海域5G网络高质量覆盖
  • 特朗普公开“怼”库克:苹果不应在印度生产手机
  • 最高人民法院原副院长唐德华逝世,享年89岁
  • 《大风杀》导演张琪:为了不算计观众,拍了部不讨好的警匪片