Qt开发技术:Q3D图表开发笔记(四):Q3DSurface三维曲面图颜色样式详解、Demo以及代码详解

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139424086

各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:开发技术(点击传送门)

上一篇:《Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解》
下一篇:敬请期待…


前言

  qt提供了q3d进行三维开发,虽然这个框架没有得到大量运用也不是那么成功,性能上也有很大的欠缺,但是普通的点到为止的应用展示还是可以的。
  其中就包括华丽绚烂的三维图表,数据量不大的时候是可以使用的。
  前面介绍了基础的q3d散点图、柱状图、三维曲面图,本片深入对三维曲面图支持的颜色表现方式进行探讨。


Demo:Q3DSurface散点图颜色演示效果

  纯色、选中点的颜色
  在这里插入图片描述

  渐进色、选中点的颜色  
  在这里插入图片描述

  按照y轴参与渐进色
  在这里插入图片描述

下载地址

  Demo 运行包下载地址:https://download.csdn.net/download/qq21497936/89394397
  QQ群下载:请点击博客主头像,可进入博客首页,查看右侧,有QQ群联系方式,(点击“文件”搜索“q3d”,群内与博文同步更新)
  Demo源码下载地址:https://download.csdn.net/download/qq21497936/89394399


Q3D提供的三维图表

  依赖QtDataVisualization。在安装qt的时候要选择安装QtDataVisualization模块。

Q3DScatter散点图

  Q3D的散点图,性能大约支撑1000个点可以不卡顿,具体依赖pc,1000个点是什么 概念,可以理解为:10x10x10的区域,每个区域一个数据点。
  在这里插入图片描述

Q3DBars柱状图

  Q3D的柱状图,性能跟散点图类似。
   在这里插入图片描述

Q3DSurface平面凹凸图,平面纹理图,平面曲线图

  Q3D的柱状图,性能跟散点图类似。
  在这里插入图片描述


Q3DSurface平面曲线图

简介

  Q3DSurface类提供了渲染3D曲面图的方法。该类使开发人员能够渲染3D表面图,并通过自由旋转场景来查看它们。可以通过QSurface3DSeries控制曲面的视觉,例如绘制模式和着色。
  Q3DSurface通过在用户用鼠标左键点击的数据点上显示高亮显示的球(当使用默认输入处理程序时)或通过QSurface3DSeries进行选择来支持选择。选择指针附带一个标签,在默认情况下,该标签显示数据点的值和点的坐标。
  轴上显示的值范围和标签格式可以通过QValue3DAxis进行控制。
  要旋转图形,请按住鼠标右键并移动鼠标。缩放是使用鼠标滚轮完成的。两者都假设默认的输入处理程序正在使用中。
  如果没有将任何轴明确设置为Q3DSurface,则会创建不带标签的临时默认轴。这些默认轴可以通过轴访问器进行修改,但只要明确设置了方向的任何轴,该方向的默认轴就会被破坏。

摄像机预制类型:CameraPreset

  注意:所有的东西都不能低于最低的Y平面从下网上看。
  枚举如下,在Demo中动态调整查看效果:

  • CameraPresetNone:用于指示尚未设置预设或场景已自由旋转
  • CameraPresetFrontLow:相机预设前低(实际y中间)
  • CameraPresetFront:相机预设前(实际前面俯视图,约45°向下)
  • CameraPresetFrontHigh:相机预设前高(实际前面俯视图,约60°向下)
  • CameraPresetLeftLow:相机预设左低
  • CameraPresetLeft:相机预设左
  • CameraPresetLeftHigh:相机预设左高
  • CameraPresetRightLow:相机预设右低
  • CameraPresetRight:相机预设右
  • CameraPresetRightHigh:相机预设右高
  • CameraPresetBehindLow:相机预设后低
  • CameraPresetBehind:相机预设后
  • CameraPresetBehindHigh:相机预设后高
  • CameraPresetIsometricLeft:相机预设左45°
  • CameraPresetIsometricLeftHigh:相机预设左45°高
  • CameraPresetIsometricRight:相机预设右45°
  • CameraPresetIsometricRightHigh:相机预设右45°高
  • CameraPresetDirectlyAbove:相机预设,中间往下看旋转Y
  • CameraPresetDirectlyAboveCW45:相机预设,中间往下看正旋转Y45°度不同
  • CameraPresetDirectlyAboveCCW45:相机预设,中间往下看逆旋转Y45°角度不同
  • CameraPresetFrontBelow:相机预设前下
  • CameraPresetLeftBelow:相机预设左下
  • CameraPresetRightBelow:相机预设右下
  • CameraPresetBehindBelow:相机预设直接在后下,实际与xz不能再往下了
  • CameraPresetDirectlyBelow:相机预设直接在下,实际与xz不能再往下了,对于仅为正的条形,充当CameraPresetFrontLow。

颜色样式:colorStyle

  注意:实测multiHightlightColor没测出来,多选的时候是这个颜色,但是设置选择模式无法一个曲面多选几个点,以下都是这样的测试结果。

  • ColorStyleUniform:对象以单一颜色渲染。使用的颜色在baseColorssingleHighlightColor和multiHighlightColor属性中指定。
// 设置颜色样式_pSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleUniform);// 设置颜色_pSurface3DSeries->setBaseColor(Qt::red);// 选中颜色_pSurface3DSeries->setSingleHighlightColor(Qt::blue);// 使用 _pQ3DSurface->setSelectionMode(QAbstract3DGraph::SelectionItem//                                    | QAbstract3DGraph::SelectionRow//                                    | QAbstract3DGraph::SelectionMultiSeries);// 也未测试出来_pSurface3DSeries->setMultiHighlightColor(Qt::green);
  • ColorStyleObjectGradient:无论对象的高度如何,对象都将使用每个对象的全渐变进行着色。使用的渐变在baseGradientssingleHighlightGradient 和 multiHighlightGraduate 属性中指定。
    // 设置颜色样式_pSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleObjectGradient);// 渐变色QLinearGradient linearGradient;linearGradient.setColorAt(0.0, Qt::red);linearGradient.setColorAt(0.333, Qt::blue);linearGradient.setColorAt(0.667, Qt::green);linearGradient.setColorAt(1.0, Qt::gray);// 设置颜色_pSurface3DSeries->setBaseGradient(linearGradient);// 选中颜色// 渐变色2QLinearGradient linearGradient2;linearGradient2.setColorAt(0.0, Qt::yellow);linearGradient2.setColorAt(1.0, Qt::gray);_pSurface3DSeries->setSingleHighlightGradient(linearGradient2);_pSurface3DSeries->setSingleHighlightColor(Qt::red);
//    _pSurface3DSeries->setMultiHighlightGraduate(Qt::green);
  • ColorStyleRangeGradient : 使用由对象的高度及其在Y轴上的位置确定的完整渐变的一部分对对象进行着色。使用的渐变在baseGradientssingleHighlightGradient 和 multiHighlightGraduate属性中指定。
    // 设置颜色样式_pSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleRangeGradient);// 渐变色QLinearGradient linearGradient;linearGradient.setColorAt(0.0, Qt::red);linearGradient.setColorAt(1.0, Qt::green);// 设置颜色_pSurface3DSeries->setBaseGradient(linearGradient);// 选中颜色// 渐变色2QLinearGradient linearGradient2;linearGradient2.setColorAt(0.0, Qt::yellow);linearGradient2.setColorAt(1.0, Qt::gray);_pSurface3DSeries->setSingleHighlightGradient(linearGradient2);_pSurface3DSeries->setSingleHighlightColor(Qt::red);
//    _pSurface3DSeries->setMultiHighlightGraduate(Qt::green);

Q3DDemo构建流程解析

步骤一:确认安装QtDataVisualization模块

  如何确认,则是在帮助文件中查看是否有Q3dscatter类。一般是安装了模块才会有对应的帮助文件。没有则重新安装qt或者单独安装该模块。
  在这里插入图片描述

步骤二:工程配置文件中加入模块

  Q3d是在数据可视化模块中,需要在pro或者pri配置文件中添加。

QT += datavisualization

  在这里插入图片描述

步骤三:添加使用到的头文件

  使用到Q3DBar相关类中添加头文件,主要使用到Q3DBar、QBar3DSeries、QBarDataRow等等。

#include <Q3DBars>
#include <Q3DTheme>
#include <Q3DSurface>
#include <QVector3D>

  在这里插入图片描述

步骤四:添加命名空间

  这时候还是无法使用对应的类,需要添加命名空间才行:

using namespace QtDataVisualization;

  在这里插入图片描述

步骤五:Q3D的图标基础构建框架

  下面是包含注释的Q3DSurface基础构建流程

    _pQ3DSurface = new Q3DSurface();_pContainer = QWidget::createWindowContainer(_pQ3DSurface, this);// 设置轴文本{// 注意笛卡尔坐标_pQ3DSurface->axisX()->setTitle("经度(°)");_pQ3DSurface->axisX()->setTitleVisible(true);_pQ3DSurface->axisY()->setTitle("高度(m)");_pQ3DSurface->axisY()->setTitleVisible(true);_pQ3DSurface->axisZ()->setTitle("纬度(°)");_pQ3DSurface->axisZ()->setTitleVisible(true);}// 设置轴范围{// 注意笛卡尔坐标_pQ3DSurface->axisX()->setRange(0, 359);_pQ3DSurface->axisY()->setRange(0, 100);_pQ3DSurface->axisZ()->setRange(0, 359);}// 生成一个曲线_pSurface3DSeries = new QSurface3DSeries(_pQ3DSurface);// 设置渲染平滑_pSurface3DSeries->setMeshSmooth(true);// 设置渲染模式//   DrawWireframe           : 绘制栅格//   DrawSurface             : 绘制表面//   DrawSurfaceAndWireframe : 绘制栅格和图表面_pSurface3DSeries->setDrawMode(QSurface3DSeries::DrawSurface);#if 0// 设置颜色样式// ColorStyleUniform = 0    : 对象以单一颜色渲染。使用的颜色在baseColors、//                            singleHighlightColor和multiHighlightColor属性中指定。// ColorStyleObjectGradient : 无论对象的高度如何,对象都将使用每个对象的全渐变进行着色。//                            使用的渐变在baseGradients、singleHighlightGradient 和 multiHighlightGraduate 属性中指定。// ColorStyleRangeGradient  :_pSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleUniform);// 设置颜色_pSurface3DSeries->setBaseColor(Qt::red);// 选中颜色_pSurface3DSeries->setSingleHighlightColor(Qt::blue);// 使用 _pQ3DSurface->setSelectionMode(QAbstract3DGraph::SelectionItem//                                    | QAbstract3DGraph::SelectionRow//                                    | QAbstract3DGraph::SelectionMultiSeries);// 也未测试出来_pSurface3DSeries->setMultiHighlightColor(Qt::green);
#endif#if 0// 设置颜色样式// ColorStyleUniform = 0    : 对象以单一颜色渲染。使用的颜色在baseColors、//                            singleHighlightColor和multiHighlightColor属性中指定。// ColorStyleObjectGradient : 无论对象的高度如何,对象都将使用每个对象的全渐变进行着色。//                            使用的渐变在baseGradients、singleHighlightGradient 和 multiHighlightGraduate 属性中指定。// ColorStyleRangeGradient  :_pSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleObjectGradient);// 渐变色QLinearGradient linearGradient;linearGradient.setColorAt(0.0, Qt::red);linearGradient.setColorAt(0.333, Qt::blue);linearGradient.setColorAt(0.667, Qt::green);linearGradient.setColorAt(1.0, Qt::gray);// 设置颜色_pSurface3DSeries->setBaseGradient(linearGradient);// 选中颜色// 渐变色2QLinearGradient linearGradient2;linearGradient2.setColorAt(0.0, Qt::yellow);linearGradient2.setColorAt(1.0, Qt::gray);_pSurface3DSeries->setSingleHighlightGradient(linearGradient2);_pSurface3DSeries->setSingleHighlightColor(Qt::red);
//    _pSurface3DSeries->setMultiHighlightGraduate(Qt::green);
#endif#if 1// 设置颜色样式// ColorStyleUniform = 0    : 对象以单一颜色渲染。使用的颜色在baseColors、//                            singleHighlightColor和multiHighlightColor属性中指定。// ColorStyleObjectGradient : 无论对象的高度如何,对象都将使用每个对象的全渐变进行着色。//                            使用的渐变在baseGradients、singleHighlightGradient 和 multiHighlightGraduate 属性中指定。// ColorStyleRangeGradient  : 使用由对象的高度及其在Y轴上的位置确定的完整渐变的一部分对对象进行着色。//                            使用的渐变在baseGradients、singleHighlightGradient 和 multiHighlightGraduate属性中指定。_pSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleRangeGradient);// 渐变色QLinearGradient linearGradient;linearGradient.setColorAt(0.0, Qt::red);linearGradient.setColorAt(1.0, Qt::green);// 设置颜色_pSurface3DSeries->setBaseGradient(linearGradient);// 选中颜色// 渐变色2QLinearGradient linearGradient2;linearGradient2.setColorAt(0.0, Qt::yellow);linearGradient2.setColorAt(1.0, Qt::gray);_pSurface3DSeries->setSingleHighlightGradient(linearGradient2);_pSurface3DSeries->setSingleHighlightColor(Qt::red);
//    _pSurface3DSeries->setMultiHighlightGraduate(Qt::green);
#endif#if 0// 设置渐进色QLinearGradient *pLinearGradient = new QLinearGradient(0, 0,100,100);pLinearGradient->setColorAt(0, Qt::red);pLinearGradient->setColorAt(1.0, Qt::blue);_pSurface3DSeries->setBaseGradient(*pLinearGradient);
#endif// 视图添加该曲线_pQ3DSurface->addSeries(_pSurface3DSeries);// 设置阴影质量_pQ3DSurface->setShadowQuality(QAbstract3DGraph::ShadowQualitySoftLow);// 设置视角_pQ3DSurface->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetNone);// 设置子网格_pQ3DSurface->activeTheme()->setGridEnabled(true);
#if 1// 添加模拟数据QSurfaceDataArray *pSurfaceDataArray = new QSurfaceDataArray;
#if 1#if 1// 这是 z 纬度for(int n = 0; n < 360; n++){QSurfaceDataRow *pSurfaceDataRow  = new QSurfaceDataRow;// 这是 x 经度for(int m = 0; m < 360; m++){
#if 0// 注意与笛卡尔坐标进行映射*pSurfaceDataRow << QVector3D(m, n / 7 + m / 7, n);
#else// 注意与笛卡尔坐标进行映射(超过180的下沉)*pSurfaceDataRow << QVector3D(m, n / 7 + m / 7 - (m > 180 ? n / 3 : 0), n);
#endif}*pSurfaceDataArray << pSurfaceDataRow;}
#elsefor(int n = 0; n < 360; n++){QSurfaceDataRow *pSurfaceDataRow  = new QSurfaceDataRow;// 这是 x 经度for(int m = 0; m < 360; m++){// 注意与笛卡尔坐标进行映射*pSurfaceDataRow << QVector3D(m, qrand() % 100, n);LOG << n << m;}*pSurfaceDataArray << pSurfaceDataRow;}
#endif
#elseQSurfaceDataRow *pSurfaceDataRow1  = new QSurfaceDataRow;QSurfaceDataRow *pSurfaceDataRow2  = new QSurfaceDataRow;QSurfaceDataRow *pSurfaceDataRow3  = new QSurfaceDataRow;// 行与行之间,要形成一个四点成面*pSurfaceDataRow1 << QVector3D(0, 0, 0)  << QVector3D(359, 20, 0);*pSurfaceDataRow2 << QVector3D(50, 20, 179)  << QVector3D(359, 40, 179);*pSurfaceDataRow3 << QVector3D(100, 80, 359)  << QVector3D(359, 100, 359);*pSurfaceDataArray << pSurfaceDataRow1 << pSurfaceDataRow2 << pSurfaceDataRow3;
#endif// 添加数据(自动冲掉之前的数据)_pSurface3DSeries->dataProxy()->resetArray(pSurfaceDataArray);#endif_pQ3DSurface->addSeries(_pSurface3DSeries);_pQ3DSurface->show();

Demo源码

Q3dSurfaceColorWidget.h

#ifndef Q3DSURFACECOLORWIDGET_H
#define Q3DSURFACECOLORWIDGET_H#include <QWidget>
#include <Q3DSurface>
#include <Q3DTheme>
#include <QSurface3DSeries>
#include <QVector3D>using namespace QtDataVisualization;namespace Ui {
class Q3dSurfaceColorWidget;
}class Q3dSurfaceColorWidget : public QWidget
{Q_OBJECTpublic:explicit Q3dSurfaceColorWidget(QWidget *parent = 0);~Q3dSurfaceColorWidget();public:void setCameraPreset(Q3DCamera::CameraPreset cameraPreset);protected:void initControl();protected:void resizeEvent(QResizeEvent *event);private slots:void on_comboBox_cameraPreset_currentIndexChanged(int index);private:Ui::Q3dSurfaceColorWidget *ui;private:Q3DSurface *_pQ3DSurface;               // q3d平面曲线图QWidget *_pContainer;                   // q3d窗口容器QSurface3DSeries  *_pSurface3DSeries ;  // q3d柱状图数据
};#endif // Q3DSURFACECOLORWIDGET_H

Q3dSurfaceColorWidget.cpp

#include "Q3dSurfaceColorWidget.h"
#include "ui_Q3dSurfaceColorWidget.h"
#include <Q3DTheme>#include <QDebug>
#include <QDateTime>
//#define LOG qDebug()<<__FILE__<<__LINE__
//#define LOG qDebug()<<__FILE__<<__LINE__<<__FUNCTION__
//#define LOG qDebug()<<__FILE__<<__LINE__<<QThread()::currentThread()
//#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd")
#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz")Q3dSurfaceColorWidget::Q3dSurfaceColorWidget(QWidget *parent) :QWidget(parent),ui(new Ui::Q3dSurfaceColorWidget),_pQ3DSurface(0),_pContainer(0),_pSurface3DSeries(0)
{ui->setupUi(this);QString version = "v1.0.0";initControl();
}Q3dSurfaceColorWidget::~Q3dSurfaceColorWidget()
{delete ui;
}void Q3dSurfaceColorWidget::setCameraPreset(Q3DCamera::CameraPreset cameraPreset)
{// 设置视角// CameraPresetNone = -1,          :    用于指示尚未设置预设,或场景已自由旋转。// CameraPresetFrontLow = 0,       :// CameraPresetFront,              :// CameraPresetFrontHigh,          :// CameraPresetLeftLow,            :// CameraPresetLeft,               :// CameraPresetLeftHigh,           :// CameraPresetRightLow,           :// CameraPresetRight,              :// CameraPresetRightHigh,          :// CameraPresetBehindLow,          :// CameraPresetBehind,             :// CameraPresetBehindHigh,         :// CameraPresetIsometricLeft,      :// CameraPresetIsometricLeftHigh,  :// CameraPresetIsometricRight,     :// CameraPresetIsometricRightHigh, :// CameraPresetDirectlyAbove,      :// CameraPresetDirectlyAboveCW45,  :// CameraPresetDirectlyAboveCCW45, :// CameraPresetFrontBelow,         :// CameraPresetLeftBelow,          :// CameraPresetRightBelow,         :// CameraPresetBehindBelow,        :// CameraPresetDirectlyBelow       :// 设置视角if(_pQ3DSurface){_pQ3DSurface->scene()->activeCamera()->setCameraPreset(cameraPreset);}
}void Q3dSurfaceColorWidget::initControl()
{// 视角预置{// 设置视角// CameraPresetNone = -1,          :    用于指示尚未设置预设,或场景已自由旋转。// CameraPresetFrontLow = 0,       :// CameraPresetFront,              :// CameraPresetFrontHigh,          :// CameraPresetLeftLow,            :// CameraPresetLeft,               :// CameraPresetLeftHigh,           :// CameraPresetRightLow,           :// CameraPresetRight,              :// CameraPresetRightHigh,          :// CameraPresetBehindLow,          :// CameraPresetBehind,             :// CameraPresetBehindHigh,         :// CameraPresetIsometricLeft,      :// CameraPresetIsometricLeftHigh,  :// CameraPresetIsometricRight,     :// CameraPresetIsometricRightHigh, :// CameraPresetDirectlyAbove,      :// CameraPresetDirectlyAboveCW45,  :// CameraPresetDirectlyAboveCCW45, :// CameraPresetFrontBelow,         :// CameraPresetLeftBelow,          :// CameraPresetRightBelow,         :// CameraPresetBehindBelow,        :// CameraPresetDirectlyBelow       :ui->comboBox_cameraPreset->clear();ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetNone");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetFrontLow = 0");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetFront");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetFrontHigh");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetLeftLow");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetLeft");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetLeftHigh");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetRightLow");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetRight");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetRightHigh");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetBehindLow");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetBehind");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetBehindHigh");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetIsometricLeft");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetIsometricLeftHigh");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetIsometricRight");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetIsometricRightHigh");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetDirectlyAbove");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetDirectlyAboveCW45");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetDirectlyAboveCCW45");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetFrontBelow");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetLeftBelow");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetRightBelow");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetBehindBelow");ui->comboBox_cameraPreset->addItem("Q3DCamera::CameraPresetDirectlyBelow");ui->comboBox_cameraPreset->setCurrentText("Q3DCamera::CameraPresetNone");}_pQ3DSurface = new Q3DSurface();_pContainer = QWidget::createWindowContainer(_pQ3DSurface, this);// 设置轴文本{// 注意笛卡尔坐标_pQ3DSurface->axisX()->setTitle("经度(°)");_pQ3DSurface->axisX()->setTitleVisible(true);_pQ3DSurface->axisY()->setTitle("高度(m)");_pQ3DSurface->axisY()->setTitleVisible(true);_pQ3DSurface->axisZ()->setTitle("纬度(°)");_pQ3DSurface->axisZ()->setTitleVisible(true);}// 设置轴范围{// 注意笛卡尔坐标_pQ3DSurface->axisX()->setRange(0, 359);_pQ3DSurface->axisY()->setRange(0, 100);_pQ3DSurface->axisZ()->setRange(0, 359);}// 生成一个曲线_pSurface3DSeries = new QSurface3DSeries(_pQ3DSurface);// 设置渲染平滑_pSurface3DSeries->setMeshSmooth(true);// 设置渲染模式//   DrawWireframe           : 绘制栅格//   DrawSurface             : 绘制表面//   DrawSurfaceAndWireframe : 绘制栅格和图表面_pSurface3DSeries->setDrawMode(QSurface3DSeries::DrawSurface);#if 0// 设置颜色样式// ColorStyleUniform = 0    : 对象以单一颜色渲染。使用的颜色在baseColors、//                            singleHighlightColor和multiHighlightColor属性中指定。// ColorStyleObjectGradient : 无论对象的高度如何,对象都将使用每个对象的全渐变进行着色。//                            使用的渐变在baseGradients、singleHighlightGradient 和 multiHighlightGraduate 属性中指定。// ColorStyleRangeGradient  :_pSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleUniform);// 设置颜色_pSurface3DSeries->setBaseColor(Qt::red);// 选中颜色_pSurface3DSeries->setSingleHighlightColor(Qt::blue);// 使用 _pQ3DSurface->setSelectionMode(QAbstract3DGraph::SelectionItem//                                    | QAbstract3DGraph::SelectionRow//                                    | QAbstract3DGraph::SelectionMultiSeries);// 也未测试出来_pSurface3DSeries->setMultiHighlightColor(Qt::green);
#endif#if 0// 设置颜色样式// ColorStyleUniform = 0    : 对象以单一颜色渲染。使用的颜色在baseColors、//                            singleHighlightColor和multiHighlightColor属性中指定。// ColorStyleObjectGradient : 无论对象的高度如何,对象都将使用每个对象的全渐变进行着色。//                            使用的渐变在baseGradients、singleHighlightGradient 和 multiHighlightGraduate 属性中指定。// ColorStyleRangeGradient  :_pSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleObjectGradient);// 渐变色QLinearGradient linearGradient;linearGradient.setColorAt(0.0, Qt::red);linearGradient.setColorAt(0.333, Qt::blue);linearGradient.setColorAt(0.667, Qt::green);linearGradient.setColorAt(1.0, Qt::gray);// 设置颜色_pSurface3DSeries->setBaseGradient(linearGradient);// 选中颜色// 渐变色2QLinearGradient linearGradient2;linearGradient2.setColorAt(0.0, Qt::yellow);linearGradient2.setColorAt(1.0, Qt::gray);_pSurface3DSeries->setSingleHighlightGradient(linearGradient2);_pSurface3DSeries->setSingleHighlightColor(Qt::red);
//    _pSurface3DSeries->setMultiHighlightGraduate(Qt::green);
#endif#if 1// 设置颜色样式// ColorStyleUniform = 0    : 对象以单一颜色渲染。使用的颜色在baseColors、//                            singleHighlightColor和multiHighlightColor属性中指定。// ColorStyleObjectGradient : 无论对象的高度如何,对象都将使用每个对象的全渐变进行着色。//                            使用的渐变在baseGradients、singleHighlightGradient 和 multiHighlightGraduate 属性中指定。// ColorStyleRangeGradient  : 使用由对象的高度及其在Y轴上的位置确定的完整渐变的一部分对对象进行着色。//                            使用的渐变在baseGradients、singleHighlightGradient 和 multiHighlightGraduate属性中指定。_pSurface3DSeries->setColorStyle(Q3DTheme::ColorStyleRangeGradient);// 渐变色QLinearGradient linearGradient;linearGradient.setColorAt(0.0, Qt::red);linearGradient.setColorAt(1.0, Qt::green);// 设置颜色_pSurface3DSeries->setBaseGradient(linearGradient);// 选中颜色// 渐变色2QLinearGradient linearGradient2;linearGradient2.setColorAt(0.0, Qt::yellow);linearGradient2.setColorAt(1.0, Qt::gray);_pSurface3DSeries->setSingleHighlightGradient(linearGradient2);_pSurface3DSeries->setSingleHighlightColor(Qt::red);
//    _pSurface3DSeries->setMultiHighlightGraduate(Qt::green);
#endif#if 0// 设置渐进色QLinearGradient *pLinearGradient = new QLinearGradient(0, 0,100,100);pLinearGradient->setColorAt(0, Qt::red);pLinearGradient->setColorAt(1.0, Qt::blue);_pSurface3DSeries->setBaseGradient(*pLinearGradient);
#endif// 视图添加该曲线_pQ3DSurface->addSeries(_pSurface3DSeries);// 设置阴影质量_pQ3DSurface->setShadowQuality(QAbstract3DGraph::ShadowQualitySoftLow);// 设置视角_pQ3DSurface->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetNone);// 设置子网格_pQ3DSurface->activeTheme()->setGridEnabled(true);
#if 1// 添加模拟数据QSurfaceDataArray *pSurfaceDataArray = new QSurfaceDataArray;
#if 1#if 1// 这是 z 纬度for(int n = 0; n < 360; n++){QSurfaceDataRow *pSurfaceDataRow  = new QSurfaceDataRow;// 这是 x 经度for(int m = 0; m < 360; m++){
#if 0// 注意与笛卡尔坐标进行映射*pSurfaceDataRow << QVector3D(m, n / 7 + m / 7, n);
#else// 注意与笛卡尔坐标进行映射(超过180的下沉)*pSurfaceDataRow << QVector3D(m, n / 7 + m / 7 - (m > 180 ? n / 3 : 0), n);
#endif}*pSurfaceDataArray << pSurfaceDataRow;}
#elsefor(int n = 0; n < 360; n++){QSurfaceDataRow *pSurfaceDataRow  = new QSurfaceDataRow;// 这是 x 经度for(int m = 0; m < 360; m++){// 注意与笛卡尔坐标进行映射*pSurfaceDataRow << QVector3D(m, qrand() % 100, n);LOG << n << m;}*pSurfaceDataArray << pSurfaceDataRow;}
#endif
#elseQSurfaceDataRow *pSurfaceDataRow1  = new QSurfaceDataRow;QSurfaceDataRow *pSurfaceDataRow2  = new QSurfaceDataRow;QSurfaceDataRow *pSurfaceDataRow3  = new QSurfaceDataRow;// 行与行之间,要形成一个四点成面*pSurfaceDataRow1 << QVector3D(0, 0, 0)  << QVector3D(359, 20, 0);*pSurfaceDataRow2 << QVector3D(50, 20, 179)  << QVector3D(359, 40, 179);*pSurfaceDataRow3 << QVector3D(100, 80, 359)  << QVector3D(359, 100, 359);*pSurfaceDataArray << pSurfaceDataRow1 << pSurfaceDataRow2 << pSurfaceDataRow3;
#endif// 添加数据(自动冲掉之前的数据)_pSurface3DSeries->dataProxy()->resetArray(pSurfaceDataArray);#endif_pQ3DSurface->addSeries(_pSurface3DSeries);_pQ3DSurface->show();}void Q3dSurfaceColorWidget::resizeEvent(QResizeEvent *event)
{
#if 1if(_pContainer){_pContainer->setGeometry(0, 50, rect().width(), rect().height() - 50);_pContainer->lower();}
#endif
}void Q3dSurfaceColorWidget::on_comboBox_cameraPreset_currentIndexChanged(int index)
{setCameraPreset((Q3DCamera::CameraPreset)(index - 1));
}

工程模板v1.3.0

  在这里插入图片描述


上一篇:《Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解》
下一篇:敬请期待…


本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139424086

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/346177.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PawSQL优化 | 分页查询太慢?别忘了投影下推

​在进行数据库应用开发中&#xff0c;分页查询是一项非常常见而又至关重要的任务。但你是否曾因为需要获取总记录数的性能而感到头疼&#xff1f;现在&#xff0c;让PawSQL的投影下推优化来帮你轻松解决这一问题&#xff01;本文以TPCH的Q12为案例进行验证&#xff0c;经过Paw…

Redisson分布式锁原理解析

前言 首先Redis执行命令是单线程的&#xff0c;所以可以利用Redis实现分布式锁&#xff0c;而对于Redis单线程的问题&#xff0c;是其线程模型的问题&#xff0c;本篇重点是对目前流行的工具Redisson怎么去实现的分布式锁进行深入理解&#xff1b;开始之前&#xff0c;我们可以…

Vmess协议是什么意思? VLESS与VMess有什么区别?

VMess 是一个基于 TCP 的加密传输协议&#xff0c;所有数据使用 TCP 传输&#xff0c;是由 V2Ray 原创并使用于 V2Ray 的加密传输协议&#xff0c;它分为入站和出站两部分&#xff0c;其作用是帮助客户端跟服务器之间建立通信。在 V2Ray 上客户端与服务器的通信主要是通过 VMes…

ThinkPHP发邮件配置教程?群发功能安全吗?

ThinkPHP发邮件的注意事项&#xff1f;如何优化邮件发送的性能&#xff1f; 无论是用户注册、密码重置还是消息提醒&#xff0c;发送邮件都是一个常见的需求。AokSend将详细介绍如何在ThinkPHP框架中配置和发送邮件&#xff0c;帮助开发者轻松实现邮件功能。 ThinkPHP发邮件&…

43【PS 作图】颜色速途

1 通过PS让画面细节模糊&#xff0c;避免被过多的颜色干扰 2 分析画面的颜色 3 作图 参考网站&#xff1a; 色感不好要怎么提升呢&#xff1f;分享一下我是怎么练习色感的&#xff01;_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1h1421Z76p/?spm_id_from333.1007.…

【Python教程】3-控制流、循环结构与简单字符串操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

MySQL之查询性能优化(七)

查询性能优化 排序优化 无论如何排序都是一个成本很高的操作&#xff0c;所以从性能角度考虑&#xff0c;应尽可能避免排序或者尽可能避免对大量数据进行排序。前面已经提到了&#xff0c;当不能使用索引生成排序结果的时候&#xff0c;MySQL需要自己进行排序&#xff0c;如果…

人脸考勤项目实训

第一章 Python-----Anaconda安装 文章目录 第一章 Python-----Anaconda安装前言一、Anaconda是什么&#xff1f;二、Anaconda的前世今生二、Windows安装步骤1.官网下载2.安装步骤安装虚拟环境 总结 前言 工欲善其事必先利其器&#xff0c;项目第一步&#xff0c;安装我们的环境…

【Unity UGUI】Screen.safeArea获取异形屏数据失败

Screen.safeArea获取不到异形屏的尺寸位置等数据 检查AndroidManifest.xml文件是否有设置&#xff1a;android:theme"style/UnityThemeSelector"&#xff0c;没有加上即可 android:theme"style/UnityThemeSelector"

第1章Hello world 4/5:对比Rust/Java/C++创建和运行Hello world全过程:运行第一个程序

讲动人的故事,写懂人的代码 1.7 对比Rust/Java/C++创建和运行Hello world全过程 有了会听懂人类的讲话,还能做记录的编程助理艾极思,他们三人的讨论内容,都可以变成一份详细的会议纪要啦。 接下来,我们一起看看艾极思是如何记录下赵可菲创建和运行Java程序Hello world,…

简记:为Docker配置服务代理

简记 为Docker配置服务代理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/art…

Leetcode3040. 相同分数的最大操作数目 II

Every day a Leetcode 题目来源&#xff1a;3040. 相同分数的最大操作数目 II 解法1&#xff1a;记忆化搜索 第一步可以做什么&#xff1f;做完后&#xff0c;剩下要解决的问题是什么&#xff1f; 删除前两个数&#xff0c;剩下 nums[2] 到 nums[n−1]&#xff0c;这是一个…

分享一个 .NET Core Console 项目中应用 NLog 写日志的详细例子

前言 日志在软件开发中扮演着非常重要的角色&#xff0c;通常我们用它来记录应用程序运行时发生的事件、错误信息、警告以及其他相关信息&#xff0c;帮助在调试和排查问题时更快速地定位和解决 Bug。 通过日志&#xff0c;我们可以做到&#xff1a; 故障排除和调试&#xff…

4.大模型微调技术LoRA

大模型低秩适配(LoRA)技术 现有PEFT 方法的局限与挑战 Adapter方法,通过增加模型深度而额外增加了模型推理延时。Prompt Tuning、Prefix Tuning、P-Tuning等方法中的提示较难训练,同时缩短了模型可用的序列长度。往往难以同时实现高效率和高质量,效果通常不及完全微调(f…

已解决Error || RuntimeError: size mismatch, m1: [32 x 100], m2: [500 x 10]

已解决Error || RuntimeError: size mismatch, m1: [32 x 100], m2: [500 x 10] 原创作者&#xff1a; 猫头虎 作者微信号&#xff1a; Libin9iOak 作者公众号&#xff1a; 猫头虎技术团队 更新日期&#xff1a; 2024年6月6日 博主猫头虎的技术世界 &#x1f31f; 欢迎来…

基于Java-SpringBoot-VUE-MySQL的高校数字化迎新管理系统

基于Java-SpringBoot-VUE-MySQL的高校数字化迎新管理系统 登陆界面 联系作者 如需本项目源代码&#xff0c;可扫码或者VX:bob1638联系作者。 首页图表 系统功能持续更新中。。。 介绍 这是一款主要用于高校迎新的系统&#xff0c;主要是采用了SpringBoot2.X VUE2.6 ElementUI2.…

mysql 数据库datetime 类型,转换为DO里面的long类型后,只剩下年了,没有了月和日

解决方法也简单&#xff1a; 自定义个一个 Date2LongTypeHandler <resultMap id"BeanResult" type"XXXX.XXXXDO"><result column"gmt_create" property"gmtCreate" jdbcType"DATE" javaType"java.lang.Long&…

软件游戏steam_api.dll丢失的解决方法,总结5种有效的方法

在玩电脑游戏时&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“游戏缺少steam_api.dll”。这个问题可能让很多玩家感到困惑和烦恼。那么&#xff0c;究竟是什么原因导致游戏缺少steam_api.dll呢&#xff1f;又该如何解决这个问题呢&#xff1f;本文将为大家…

Jmeter压测 —— 1秒发送1次请求

场景&#xff1a;有时候测试场景需要设置请求频率为一秒一次&#xff08;或几秒一次&#xff09;实现方法一&#xff1a;1、首先需要在线程组下设置循环次数&#xff08;可以理解为请求的次数&#xff09; 次数设置为请求300次&#xff0c;其中线程数跟时间自行设置 2、在设置…

JavaScript前端技术入门教程

引言 在前端开发的广阔天地中&#xff0c;JavaScript无疑是最耀眼的一颗明星。它赋予了网页动态交互的能力&#xff0c;让网页从静态的文本和图片展示&#xff0c;进化为可以与用户进行实时交互的丰富应用。本文将带您走进JavaScript的世界&#xff0c;为您提供一个入门级的教…