上篇介绍了Qt Charts二维图表模块,本篇笔记总结Qt三维图表模块——Data Visualization。同样,在Qt5.7之前之后商业版才有,从Qt5.7开始免费开放在了社区版中。与QtCharts类似,也是基于Qt的Graphics View图形视图架构。当然,目前的Data Visualization还无法和一些专业的三维显示类库相提并论,但是对于一些简单的三维数据显示是比较实用的。另外,本人目前为止还未用过这个模块,所以文中不适当的地方请多包涵,也请评论区提宝贵意见。

概述

Data Visualization的三维显示功能主要由三种三维图形来实现,分别是三维柱状图Q3DBars,三维空间散点Q3DScatter,三维曲面Q3DSurface。这三个类的父类都是QAbstract3DGraph,从QWindow继承而来。

Data Visualization与Qt Charts类似都是基于Qt Graphics View的图形视图结构,所以一个三维图形也是由图表、序列、坐标轴等元素构成。响应的序列类有:QBar3DSeries,QScatter3DSeries,QSurface3DSeries类。这三个序列类是与图形类Q3DBars,Q3DScatter,Q3DSurface一一对应的。在一个图中可以有多个同类型的序列,但不能有不同类型的序列。另外,三维图形也有坐标轴类,共有两种坐标轴类:QValue3DAxis和QCategory3DAxis,前者用于数值型坐标轴,后者用于文字型坐标轴。

Data Visualization模块中还有数据代理(Data Proxies),数据代理类就是与序列对应,用于存储序列的数据的类。这也涉及一些具体的功能类:QBarDataProxy,QScatterDataProxy和QSurfaceDataProxy,这也与三种图表一一对应。

在使用时,需要在Qt工程.pro文件中加入:

QT += datavisualization

如果是VS工程,需要在Qt Settings中勾选这一模块。

在调用时源码中添加:

#include <QtDataVisualization>

using namespace QtDataVisualization;

如果你仅仅用到了其中部分头文件,比如只用到了Q3DBars,建议只include相关的几个头文件。

三维柱状图

Q3DBars实现创建图表,QBar3DSeries and QBarDataProxy用于设置序列和数据,同时可以控制可视化属性。场景默认具备旋转,缩放,可以选中某一条目等。

#include <QtWidgets/QApplication>
#include <QtDataVisualization>
using namespace QtDataVisualization;int main(int argc, char *argv[])
{QApplication a(argc, argv);//构造一个三维柱状图对象Q3DBars bars;bars.setFlags(bars.flags() ^ Qt::FramelessWindowHint);    //top level//设置坐标轴的显示范围bars.rowAxis()->setRange(0, 4);bars.columnAxis()->setRange(0, 4);//创建5行数据,放入序列,添加到图形QBar3DSeries *series = new QBar3DSeries;QBarDataRow *data = new QBarDataRow;*data << 1.0f << 3.0f << 7.5f << 5.0f << 2.2f;series->dataProxy()->addRow(data);bars.addSeries(series);bars.show();return a.exec();
}

三维散点图

Q3DScatter实现图形,QScatter3DSeries and QScatterDataProxy实现序列和数据,并控制图表的可视化属性。场景默认具备旋转,缩放,可以选中某一条目等。

#include <QtWidgets/QApplication>
#include <QtDataVisualization>
using namespace QtDataVisualization;int main(int argc, char **argv)
{QGuiApplication app(argc, argv);//创建Q3DScatter三维散点图类对象Q3DScatter scatter;scatter.setFlags(scatter.flags() ^ Qt::FramelessWindowHint);//新建序列和数据,在序列中加入3个点,把序列添加到图形QScatter3DSeries *series = new QScatter3DSeries;QScatterDataArray data;data << QVector3D(0.5f, 0.5f, 0.5f) << QVector3D(-0.3f, -0.5f, -0.4f) << QVector3D(0.0f, -0.3f, 0.2f);series->dataProxy()->addItems(data);scatter.addSeries(series);scatter.show();return app.exec();
}

三维曲面图

Q3DSurface类实现图形,QSurface3DSeries and QSurfaceDataProxy实现序列和数据,并控制可视化属性。同样,具备旋转,缩放和选中数据的基本操作。

#include <QtWidgets/QApplication>
#include <QtDataVisualization>
using namespace QtDataVisualization;int main(int argc, char **argv)
{QGuiApplication app(argc, argv);//创建一个三维曲面对象Q3DSurface surface;surface.setFlags(surface.flags() ^ Qt::FramelessWindowHint);//创建数据对象QSurfaceDataArray *data = new QSurfaceDataArray;QSurfaceDataRow *dataRow1 = new QSurfaceDataRow;QSurfaceDataRow *dataRow2 = new QSurfaceDataRow;//为数据对象赋值*dataRow1 << QVector3D(0.0f, 0.1f, 0.5f) << QVector3D(1.0f, 0.5f, 0.5f);*dataRow2 << QVector3D(0.0f, 1.8f, 1.0f) << QVector3D(1.0f, 1.2f, 1.0f);*data << dataRow1 << dataRow2;//创建序列,加入数据,添加到Q3DSurfaceQSurface3DSeries *series = new QSurface3DSeries;series->dataProxy()->resetArray(data);surface.addSeries(series);surface.show();return app.exec();
}

数据管理

序列(Series)拥有一系列被data proxy控制的数据,可以控制可视化渲染属性,比如颜色等。每一个三维图都有它自己对应的series类。实际使用时,用户想要显示的数据通常是很多格式的,直接添加到Series中是不支持的。Qt实现了数据代理data proxies,以使得用户可以用自己熟知的类型定义数据,通过data proxies转化传递。,每一种图形也是有对应的basic proxy类型。比如,QBar3DSeries对应QBarDataProxy,QBarDataProxy中保存有QBarDataItem对象,每一个QBarDataItem对象保存一个单独的bar value。

  Q3DBars graph;QBarDataProxy *newProxy = new QBarDataProxy;QBarDataArray *dataArray = new QBarDataArray;dataArray->reserve(10);for (int i = 0; i < 10; i++) {QBarDataRow *dataRow = new QBarDataRow(5);for (int j = 0; j < 5; j++)(*dataRow)[j].setValue(myData->getValue(i, j));dataArray->append(dataRow);}newProxy->resetArray(dataArray);graph->addSeries(new QBar3DSeries(newProxy));

上述例子描述了用基本的数据代理实现自定义数据mydata对象的传递。特别的,Series对象一次只能拥有一个proxy。当有新的proxy被设置到Series后,之前的proxy会被删除。但是图表可以同时拥有多条Series,如果你想在两组数据中转换,建议用两个Series会更加有效。

因为三维绘图也是基于Model/View架构,我们当然可以用model管理数据,这也是Qt的常见方式。每个三维图类型也提供了特殊的proxy类以实现Model数据的传递。比如,QItemModelBarDataProxy则可以实现将Model数据于QBar3DSeries关联起来。这些类使用起来很简单,只需要给出Model Item的指针和如何映射到basic proxy就可以。这种映射规则类似于告诉proxy在model item中的哪个值属于哪一行,属于哪一列,哪个值表示了具体的数值等等。通常,item Models只有一种角色,但是包含了映射所需的多个值。这时候将用到item model proxies的模式匹配和自动替换技术。

    const VariantDataItemList &itemList = m_dataSet->itemList();int rowIndex = m_mapping->rowIndex();int columnIndex = m_mapping->columnIndex();int valueIndex = m_mapping->valueIndex();const QStringList &rowList = m_mapping->rowCategories();const QStringList &columnList = m_mapping->columnCategories();// Sort values into rows and columnstypedef QHash<QString, float> ColumnValueMap;QHash <QString, ColumnValueMap> itemValueMap;foreach (const VariantDataItem *item, itemList) {itemValueMap[item->at(rowIndex).toString()][item->at(columnIndex).toString()]= item->at(valueIndex).toReal();}

例子

最后上一个地形图的三维例子:https://download.csdn.net/download/bjtuwayne/12033065

Qt开发总结(20)——Data Visualization相关推荐

  1. Qt三维图表模块 -- Data Visualization 学习记录

    Qt三维图表模块 ----- Data Visualization Qt数据可视化模块提供了一种将三维图形中的数据可视化为条形图.散点图和曲面图的方法.它对于可视化深度图和大量快速变化的数据特别有用, ...

  2. Data Visualization(一)

    Data Visualization是Qt提供的用于数据三维显示的模块.Data Visualization用于数据的三维显示,包括三维柱状图.三维空间散点图.三维曲面等.Data Visualiza ...

  3. Qt Data Visualization

    Qt Data Visualization  写在前面:  正文:   一 Demo--audiolevels 运行效果:   二 Demo--bars 运行效果:   三 Demo--customi ...

  4. QT开发pjsip的VOIP,A8平台运行

    QT开发pjsip的VOIP 开发环境 平台:A8 环境:Linux-3.0.8 实现功能:使用QT开发VOIP进行初始化.拨号.挂起 测试工具:minisipserver服务器 效果 界面: min ...

  5. Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/117660217 长期持续带来更多项目与技术分享,咨询请 ...

  6. Qt开发技术:Qt的动态静态插件框架介绍和Demo

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/105481285 长期持续带来更多项目与技术分 ...

  7. 多条Qt开发常见问题及解决方法汇总

    1. 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 2. 定时器是个好东西,学会好使用它,有时候 ...

  8. Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130264470 各位读者,知识无穷而人力有穷,要么改需 ...

  9. QT开发笔记(多媒体)

    多媒体 多媒体(Multimedia)是多种媒体的综合,一般包括文本,声音和图像等多种媒体形式. 在计算机系统中,多媒体指组合两种或两种以上媒体的一种人机交互式信息交流和传播媒体. 使用的媒体包括文字 ...

最新文章

  1. so 加载符号找不到的问题解决
  2. PHP多种序列化/反序列化的方法 json_encode json_decode
  3. IDEA中怎样运行Web项目
  4. python def return 文件_python基础-文件处理与函数
  5. linux网络的高可用性,构建高可用性网络
  6. Redis自定义动态字符串(sds)模块(二)
  7. 操作符union/union all、intersect、minus、(not)exist
  8. 2021年即墨萃英中学高考成绩查询,2017即墨萃英中学青岛十九中录取分数线发布...
  9. python没有错误但是不显示结果_解决Pycharm无法显示matplotlib绘图问题
  10. 实例展示elasticsearch集群生态,分片以及水平扩展.
  11. 电容元器件外观视觉检测系统方案设计-东莞康耐德
  12. 【涨姿势】Prince2和PMP的区别,大多数人都没搞清楚!
  13. 海外邮件收发阻碍多?网易企业邮箱为您保驾护航【网易企业邮箱怎么申请】
  14. 店铺管理系统是智商税还是真有用?我们替你实测了最火的五个软件!市面上最火的五款店铺管理系统大测评!
  15. 生命密码是几适合学计算机,生命密码学
  16. pgsql 日期转换
  17. 关于ReportingService配置邮件发送报表到其他邮箱的配置
  18. 将Excel中的矩阵变成列表
  19. 公式图片转latex神器Mathpix以及latex公式与word公式的相互转换
  20. [Ubuntu]MW150us-rtl8188eu 驱动编译安装

热门文章

  1. 我把废旧 Android 手机改造成了 Linux 服务器,Android开发学习视频
  2. ENS最新合约源码分析二
  3. 如何在Linux虚拟机上创建、挂载虚拟磁盘?
  4. java毕业设计读书笔记共享平台(附源码、数据库)
  5. 什么是“声音”和“超声波”
  6. python语言程序设计实验题_“Python语言程序设计”问卷调查
  7. Android初学之:如何添加菜单栏
  8. 2021年秋PTA乙 7-2 数以类聚 (20 分)
  9. Linux笔记之浅析linux文件的压缩与解压——tar命令
  10. profinet通讯 西门子PROFINET 开发 远程IO 有实际项目产品应用经验 提供整套方案