QT中3D的使用

一.Q3DScatter3D粒子效果的使用

1.头文件添加QT5.15版本

cpp 复制代码
#include <QtDataVisualization/Q3DSurface>
#include <QtDataVisualization/QSurfaceDataProxy>
#include <QtDataVisualization/QSurface3DSeries>
#include <cmath>
#include <Q3DScatter>

using namespace QtDataVisualization;
    QtDataVisualization::Q3DScatter *scatterGraph;
    QtDataVisualization::QScatterDataProxy *scatterProxy;
    QtDataVisualization::QScatter3DSeries *scatterSeries;

2..cpp初始化

cpp 复制代码
 // 创建散点图(可以显示为平面效果)
    scatterGraph = new QtDataVisualization::Q3DScatter();
    scatterProxy = new QtDataVisualization::QScatterDataProxy();
    scatterSeries = new QtDataVisualization::QScatter3DSeries(scatterProxy);
    scatterGraph->addSeries(scatterSeries);

    QLinearGradient gradient;
    // gradient.setColorAt(0.0, QColor(255, 255, 255)); // h白色
    gradient.setColorAt(0.0, Qt::darkBlue);
    gradient.setColorAt(0.1, QColor(4, 49, 255)); // 深蓝
    gradient.setColorAt(0.2, QColor(1, 100, 253)); // 蓝绿
    gradient.setColorAt(0.3, QColor(4, 155, 252)); // 绿
    gradient.setColorAt(0.4, QColor(4, 203, 255)); // 黄绿
    gradient.setColorAt(0.5, QColor(3, 255, 2)); // 黄色
    gradient.setColorAt(0.6, QColor(254, 255, 2)); // 橙色
    gradient.setColorAt(0.7, QColor(254, 151, 4)); // 深橙
    gradient.setColorAt(0.8, QColor(255, 100, 2));   // 更深的橙色(新增)
    gradient.setColorAt(0.9, QColor(255, 70, 2));    // 接近红色(新增)
    gradient.setColorAt(1.0, QColor(255, 0, 0)); // 纯红
    scatterSeries->setBaseGradient(gradient);//平面3D显示
    scatterSeries->setColorStyle(QtDataVisualization::Q3DTheme::ColorStyleRangeGradient);
    // scatterGraph->axisY()->setRange(0, maxcolorevalue);  //设置Y轴数据范围

    // 设置坐标轴范围 - 对应52×44的坐标
    scatterGraph->axisX()->setRange(0, 51);  // X轴: 0-51 (52个点)
    scatterGraph->axisZ()->setRange(0, 43);  // Z轴: 0-43 (44个点)
    scatterGraph->axisY()->setRange(0, 255); // Y轴: 数据值范围

    // 设置坐标轴标签
    scatterGraph->axisX()->setTitle("X轴 (0-51)");
    scatterGraph->axisZ()->setTitle("Z轴 (0-43)");
    scatterGraph->axisY()->setTitle("数据值");
    // 设置视角为俯视图,显示平面效果
    scatterGraph->scene()->activeCamera()->setCameraPreset(QtDataVisualization::Q3DCamera::CameraPresetDirectlyAbove);

    // 设置点大小和样式
    scatterSeries->setItemSize(0.05f); // 较小的点大小,避免重叠
    scatterSeries->setBaseColor(Qt::blue);

    // 设置主题和网格
    scatterGraph->activeTheme()->setType(QtDataVisualization::Q3DTheme::ThemeQt);
    scatterGraph->activeTheme()->setGridEnabled(true);



    QWidget *container = QWidget::createWindowContainer(scatterGraph);
    QVBoxLayout *layout = new QVBoxLayout(ui->widget);//添加到自己创建的UI界面中
    layout->addWidget(container);
    layout->setContentsMargins(0,0,0,0);
    ui->widget->setLayout(layout);

3.数据传入

cpp 复制代码
//     // if (data.size() != current_x_num * current_y_num) {
//     //     qWarning() << "Data size does not match dimensions:" << data.size() << "!=" << dataWidth * dataHeight;
//     //     return;
//     // }

//     QtDataVisualization::QScatterDataArray *dataArray = new QtDataVisualization::QScatterDataArray();
//     dataArray->reserve(current_x_num * current_y_num);

//     // 映射数据到坐标
//     for (int z = 0; z < current_y_num; z++) {
//         for (int x = 0; x < current_x_num; x++) {
//             int dataIndex = x + z * current_x_num;
//             float yValue = data[dataIndex];

//             // 设置点的位置:X坐标对应列,Z坐标对应行,Y坐标对应数据值
//             dataArray->append(QVector3D(x, yValue, z));
//         }
//     }

//     scatterProxy->resetArray(dataArray);

4.效果图,还是很好看的粒子效果

二、Q3DSurface使用这个创建平面3D显示效果

1..h对象定义

cpp 复制代码
    QtDataVisualization::Q3DSurface *graph;
    QtDataVisualization::QSurfaceDataProxy *dataProxy;
    QtDataVisualization::QSurface3DSeries *series;
    QtDataVisualization::QSurfaceDataArray *dataArray;

2..cpp进行对应初始化

cpp 复制代码
 // Create the 3D graph
    graph = new QtDataVisualization::Q3DSurface();
    // Create data series
    dataProxy = new QtDataVisualization::QSurfaceDataProxy();
    series = new QtDataVisualization::QSurface3DSeries(dataProxy);//生成一个曲线

    graph->activeTheme()->setType(QtDataVisualization::Q3DTheme::ThemeQt);
    // Configure the appearance of the series
    // series->setDrawMode(QtDataVisualization::QSurface3DSeries::DrawSurfaceAndWireframe);//同时显示曲面和网格线
    // 设置渲染模式
    //   DrawWireframe           : 绘制栅格
    //   DrawSurface             : 绘制表面
    //   DrawSurfaceAndWireframe : 绘制栅格和图表面
    series->setDrawMode(QtDataVisualization::QSurface3DSeries::DrawSurface);//显示曲面   不同设置表示不同的显示方式
    series->setFlatShadingEnabled(true);//True:使用平面着色(每个面片颜色一致,无渐变)  False(默认):使用光滑着色

    // Add the series to the graph
    graph->addSeries(series);

    // 初始化时分配足够的内存
    dataArray = new QtDataVisualization::QSurfaceDataArray;
    for (int i = 0; i < current_y_num; i++){
        *dataArray << new QtDataVisualization::QSurfaceDataRow(current_x_num);
    }
    dataProxy->resetArray(dataArray);

    QLinearGradient gradient;
    // gradient.setColorAt(0.0, QColor(255, 255, 255)); // h白色
    gradient.setColorAt(0.0, Qt::darkBlue);
    gradient.setColorAt(0.1, QColor(4, 49, 255)); // 深蓝
    gradient.setColorAt(0.2, QColor(1, 100, 253)); // 蓝绿
    gradient.setColorAt(0.3, QColor(4, 155, 252)); // 绿
    gradient.setColorAt(0.4, QColor(4, 203, 255)); // 黄绿
    gradient.setColorAt(0.5, QColor(3, 255, 2)); // 黄色
    gradient.setColorAt(0.6, QColor(254, 255, 2)); // 橙色
    gradient.setColorAt(0.7, QColor(254, 151, 4)); // 深橙
    gradient.setColorAt(0.8, QColor(255, 100, 2));   // 更深的橙色(新增)
    gradient.setColorAt(0.9, QColor(255, 70, 2));    // 接近红色(新增)
    gradient.setColorAt(1.0, QColor(255, 0, 0)); // 纯红

    series->setBaseGradient(gradient);
    series->setColorStyle(QtDataVisualization::Q3DTheme::ColorStyleRangeGradient);

    // 4. 确保数据范围合理
    // Configure the axes
    graph->axisX()->setLabelFormat("%.1f");
    graph->axisY()->setLabelFormat("%.1f");
    graph->axisZ()->setLabelFormat("%.1f");

    graph->axisX()->setTitle("列");
    graph->axisY()->setTitle("Y轴");
    graph->axisZ()->setTitle("行");
    graph->axisZ()->setTitleVisible(true);
    graph->axisX()->setTitleVisible(true);
    graph->axisY()->setTitleVisible(true);
    // graph->axisX()->setLabelFormat("X");
    // graph->axisZ()->setLabelFormat("y");

    // 2. 自动范围调整
    // graph->axisX()->setAutoAdjustRange(true);  // 适当调整范围
    // graph->axisY()->setAutoAdjustRange(true);
    // graph->axisZ()->setAutoAdjustRange(true);
    // graph->axisZ()->setTitle("3D显示");
    // 3. 设置 XYZ 轴范围
    graph->axisX()->setRange(0, current_x_num-1);
    graph->axisZ()->setRange(0, current_y_num-1);
    graph->axisY()->setRange(0, 255);  // 固定范围
    graph->axisY()->setAutoAdjustRange(false);  // 禁用自动调整
    // Configure the graph
    // graph->setActiveTheme(new Q3DTheme(Q3DTheme::ThemePrimaryColors));
    // graph->activeTheme()->setType(QtDataVisualization::Q3DTheme::ThemeDigia);
    graph->setShadowQuality(QtDataVisualization::QAbstract3DGraph::ShadowQualitySoftMedium);
    graph->scene()->activeCamera()->setCameraPreset(QtDataVisualization::Q3DCamera::CameraPresetIsometricRight);
    //将3D添加布局中
    QWidget *container = QWidget::createWindowContainer(graph);
    QVBoxLayout *layout = new QVBoxLayout(ui->widget);
    layout->addWidget(container);
    layout->setContentsMargins(0,0,0,0);
    ui->widget->setLayout(layout);

3.传入数据显示

cpp 复制代码
// 确保数组尺寸匹配
    if (dataArray->size() != numCols || (*dataArray)[0]->size() != numRows) {
        dataArray->clear();
        for (int i = 0; i < numCols; i++) {
            *dataArray << new QtDataVisualization::QSurfaceDataRow(numRows);
        }
    }

    for (int i = 0; i < numCols; i++) {
        auto &row = *(*dataArray)[i];
        float z = float(i);  // 使用实际的行索引作为Z坐标
        for (int j = 0; j < numRows; j++) {
            float x = float(j);  // 使用实际的列索引作为X坐标
            float y = 0.0f;

            y = data[dataIndex] * 1.0f;
            // y = smoothData(j, i, data); //平滑处理
            // if(externshow_parameter==1) y*=10;
            row[j].setPosition(QVector3D(x, y, z));
        }
    }
    graph->axisY()->setRange(mincolorsvalue, maxcolorevalue);  // 固定范围
    dataProxy->resetArray(dataArray);

4.效果图

相关推荐
star learning white1 小时前
xmC语言8
c语言·开发语言·算法
喵了几个咪1 小时前
Golang微服务框架Kratos实现Thrift服务
开发语言·微服务·golang
Laravel技术社区1 小时前
php 读取视频流(mp4视频文件),快速读取视频解决方案(案例及配置)
开发语言·php·音视频
q***96581 小时前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
ytttr8731 小时前
基于MATLAB实现晶体共晶凝固模拟
开发语言·算法·matlab
k***1952 小时前
Spring Boot中集成MyBatis操作数据库详细教程
数据库·spring boot·mybatis
鄃鳕2 小时前
装饰器【Python】
开发语言·python·数码相机
倔强的石头_2 小时前
openGauss进阶:使用DBeaver可视化管理与实战
数据库