一.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.效果图
