QT----------QT Data Visualzation

实现思路:

  1. 配置项目:在 .pro 文件中添加 QT += datavisualization 以引入 QT Data Visualization 模块。
  2. 创建主窗口:使用 QMainWindow 作为主窗口,添加 Q3DScatterQ3DBarsQ3DSurface 等三维视图组件。
  3. 初始化和创建三维图表:分别为每种类型的图表(柱状图、散点图、曲面图)创建数据集、系列和轴,并将它们添加到相应的三维视图中。
  4. 其他功能实现:根据需要添加一些自定义功能,如调整视角、添加数据操作等。

代码示例:

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtDataVisualization/Q3DScatter>
#include <QtDataVisualization/Q3DBars>
#include <QtDataVisualization/Q3DSurface>
#include <QtDataVisualization/QBar3DSeries>
#include <QtDataVisualization/QScatter3DSeries>
#include <QtDataVisualization/QSurface3DSeries>
#include <QtDataVisualization/QValue3DAxis>
#include <QtDataVisualization/QCustom3DItem>
#include <QtCore/QRandomGenerator>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>QT_USE_NAMESPACE
using namespace QtDataVisualization;// 辅助函数:生成随机数
float randomFloat(float min, float max) {return QRandomGenerator::global()->bounded(min, max);
}int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建主窗口QMainWindow mainWindow;QWidget *centralWidget = new QWidget(&mainWindow);mainWindow.setCentralWidget(centralWidget);QVBoxLayout *layout = new QVBoxLayout(centralWidget);// 三维柱状图Q3DBars *bars = new Q3DBars();QBar3DSeries *barSeries = new QBar3DSeries();QBarDataRow *dataRow1 = new QBarDataRow();QBarDataRow *dataRow2 = new QBarDataRow();for (int i = 0; i < 5; ++i) {*dataRow1 << randomFloat(0, 10);*dataRow2 << randomFloat(0, 10);}barSeries->dataProxy()->addRow(dataRow1);barSeries->dataProxy()->addRow(dataRow2);bars->addSeries(barSeries);QValue3DAxis *barAxisX = new QValue3DAxis();barAxisX->setTitle("X Axis");barAxisX->setRange(0, 4);bars->setValueAxisX(barAxisX);QValue3DAxis *barAxisY = new QValue3DAxis();barAxisY->setTitle("Y Axis");barAxisY->setRange(0, 1);bars->setValueAxisY(barAxisY);QValue3DAxis *barAxisZ = new QValue3DAxis();barAxisZ->setTitle("Z Axis");barAxisZ->setRange(0, 10);bars->setValueAxisZ(barAxisZ);QWidget *barsContainer = QWidget::createWindowContainer(bars);layout->addWidget(barsContainer);// 三维散点图Q3DScatter *scatter = new Q3DScatter();QScatter3DSeries *scatterSeries = new QScatter3DSeries();for (int i = 0; i < 100; ++i) {scatterSeries->dataProxy()->addItem(new QScatterDataItem(QVector3D(randomFloat(0, 10), randomFloat(0, 10), randomFloat(0, 10)));}scatter->addSeries(scatterSeries);QValue3DAxis *scatterAxisX = new QValue3DAxis();scatterAxisX->setTitle("X Axis");scatterAxisX->setRange(0, 10);scatter->setValueAxisX(scatterAxisX);QValue3DAxis *scatterAxisY = new QValue3DAxis();scatterAxisY->setTitle("Y Axis");scatterAxisY->setRange(0, 10);scatter->setValueAxisY(scatterAxisY);QValue3DAxis *scatterAxisZ = new QValue3DAxis();scatterAxisZ->setTitle("Z Axis");scatterAxisZ->setRange(0, 10);scatter->setValueAxisZ(scatterAxisZ);QWidget *scatterContainer = QWidget::createWindowContainer(scatter);layout->addWidget(scatterContainer);// 三维曲面图Q3DSurface *surface = new Q3DSurface();QSurface3DSeries *surfaceSeries = new QSurface3DSeries();QSurfaceDataArray *dataArray = new QSurfaceDataArray();int size = 50;for (int i = 0; i < size; ++i) {QSurfaceDataRow *dataRow = new QSurfaceDataRow();for (int j = 0; j < size; ++j) {float x = (float)i / (size - 1) * 10;float y = (float)j / (size - 1) * 10;float z = sin(sqrt(x * x + y * y));*dataRow << QVector3D(x, y, z);}*dataArray << dataRow;}surfaceSeries->dataProxy()->resetArray(dataArray);surface->addSeries(surfaceSeries);QValue3DAxis *surfaceAxisX = new QValue3DAxis();surfaceAxisX->setTitle("X Axis");surfaceAxisX->setRange(0, 10);surface->setValueAxisX(surfaceAxisX);QValue3DAxis *surfaceAxisY = new QValue3DAxis();surfaceAxisY->setTitle("Y Axis");surfaceAxisY->setRange(0, 10);surface->setValueAxisY(surfaceAxisY);QValue3DAxis *surfaceAxisZ = new QValue3DAxis();surfaceAxisZ->setTitle("Z Axis");surface->setValueAxisZ(surfaceAxisZ);QWidget *surfaceContainer = QWidget::createWindowContainer(surface);layout->addWidget(surfaceContainer);mainWindow.show();return a.exec();
}

代码解释:

  1. 三维柱状图

    • Q3DBars 是三维柱状图的视图组件。
    • QBar3DSeries 是柱状图的数据系列,使用 QBarDataRow 存储数据行。
    • QValue3DAxis 用于设置 x、y 和 z 轴的范围和标题。
    • QWidget::createWindowContainer 将三维视图组件包装成一个 QWidget,以便添加到布局中。
  2. 三维散点图

    • Q3DScatter 是三维散点图的视图组件。
    • QScatter3DSeries 是散点图的数据系列,使用 QScatterDataItem 添加数据点。
      在这里插入图片描述
  3. 三维曲面图

    • Q3DSurface 是三维曲面图的视图组件。
    • QSurface3DSeries 是曲面图的数据系列,使用 QSurfaceDataArrayQSurfaceDataRow 存储数据点。
    • 在示例中,使用 sin(sqrt(x * x + y * y)) 生成一个简单的曲面形状。

配置 .pro 文件:

确保在 .pro 文件中添加以下内容:

QT += datavisualization widgets
CONFIG += c++11

使用说明:

  1. 将上述代码保存为一个 .cpp 文件,例如 main.cpp
  2. 创建一个 .pro 文件,添加上述配置。
  3. 编译并运行程序,你将看到一个包含三维柱状图、三维散点图和三维曲面图的主窗口。

其他功能的实现:

  • 调整视角:可以使用 bars->scene()->activeCamera()->setCameraPosition 等方法调整三维视图的视角。
  • 添加交互功能:可以通过重写 Q3DScatterQ3DBarsQ3DSurface 的鼠标事件函数,实现数据点的选择、高亮显示等交互功能。
  • 三维地形图:对于三维地形图,可以使用高度图数据替换 QSurface3DSeries 的数据,通过读取地理信息系统(GIS)数据或生成地形数据文件来实现。例如,使用 QSurfaceDataArray 存储地形的高程信息,以 xy 表示位置,z 表示高度。

在这里插入图片描述

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

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

相关文章

IT运维的365天--024 闲置路由器关闭了dhcp,如何知道它的IP是啥

有时候各种原因&#xff0c;我们关闭了路由器的Dhcp&#xff0c;比如需要获取的无线IP和有线同一个网段的情况。时间久了&#xff0c;如果没做标记&#xff0c;大部分时候就会忘了路由器原来设置的是什么IP&#xff0c;没有路由器的对应IP&#xff0c;自然也无法进路由器后台去…

以余弦序列谈频谱泄漏

廖老师说频谱泄漏是指有新的频率分量生成。一句话get到点上。 对于频谱泄露&#xff0c;信号为无限长序列&#xff0c;运算需要截取其中一部分&#xff08;截断&#xff09;&#xff0c;于是需要加窗函数&#xff0c;加了窗函数相当于时域相乘&#xff0c;于是相当于频域卷积&…

前端项目打包发布

webstorm下的vue项目 打包项目 在package.json中执行打包命令&#xff0c;运行结束后会生成一个 dist目录 发布项目 通过tomcat部署项目 注意&#xff1a;通过tomcat发布前端项目不需要重启tomcat&#xff0c;如果有文件更新需要重启tomcat 在虚拟机上进入tomcat的webapp…

R语言6种将字符转成数字的方法,写在新年来临之际

咱们临床研究中&#xff0c;拿到数据后首先要对数据进行清洗&#xff0c;把数据变成咱们想要的格式&#xff0c;才能进行下一步分析&#xff0c;其中数据中的字符转成数字是个重要的内容&#xff0c;因为字符中常含有特殊符号&#xff0c;不利于分析&#xff0c;转成数字后才能…

华为消费级QLC SSD来了

近日&#xff0c;有关消息显示&#xff0c;华为的消费级SSD产品线&#xff0c;eKitStor Xtreme 200E系列&#xff0c;在韩国一家在线零售商处首次公开销售&#xff0c;引起了业界的广泛关注。 尽管华为已经涉足服务器级别的SSD制造多年&#xff0c;但直到今年6月才正式推出面向…

【生活】冬天如何选口罩(医用口罩,N95, KN95还是KP95?带不带呼吸阀门?带不带活性炭?)

&#x1f4a1;总结一下就是&#xff1a; 日常防护的话&#xff0c;医用口罩就可以啦。要是想长时间佩戴N95&#xff08;KN95&#xff09;口罩的话也可以. 在高风险环境&#xff08;像医院、疫情防控期间&#xff09;&#xff0c;一定要选不带呼吸阀门的N95口罩KN95&#xff09…

Javascript算法——回溯算法(组合问题)

相关资料来自《代码随想录》&#xff0c;版权归原作者所有&#xff0c;只是学习记录 回溯 回溯模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点…

【门铃工作原理】2021-12-25

缘由关于#门铃工作原理#的问题&#xff0c;如何解决&#xff1f;-嵌入式-CSDN问答 4 RST&#xff08;复位&#xff09;当此引脚接高电平时定时器工作&#xff0c;当此引脚接地时芯片复位&#xff0c;输出低电平。 按钮按下给电容器充电并相当与短路了R1改变了频率&#xff0c;按…

2025年,测试技能支棱起来。

你是否曾为提升自己的测试技能而烦恼&#xff1f;在这个日新月异的技术时代&#xff0c;2025年已经悄然而至&#xff0c;软件测试行业的需求和挑战也在不断变化。那么&#xff0c;如何在这个竞争激烈的环境中脱颖而出&#xff0c;成为一名更加优秀的测试工程师呢&#xff1f; …

【AI创作】kimi API初体验

一、介绍 接口文档 https://platform.moonshot.cn/docs/guide/migrating-from-openai-to-kimi 收费详情 并发: 同一时间内我们最多处理的来自您的请求数RPM: request per minute 指一分钟内您最多向我们发起的请求数TPM: token per minute 指一分钟内您最多和我们交互的toke…

LLM2Vec: 解锁大语言模型的隐藏能力

LLM2Vec&#xff1a;重新定义大语言模型在自然语言处理中的应用 一种名为 ** LLM2Vec ** 的新方法正在改变我们对大语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;中的使用方式。 研究人员提出了一种创新方法&#xff0c;将通常仅用于生成文…

人工智能安全与隐私——联邦遗忘学习(Federated Unlearning)

前言 在联邦学习&#xff08;Federated Learning, FL&#xff09;中&#xff0c;尽管用户不需要共享数据&#xff0c;但全局模型本身可以隐式地记住用户的本地数据。因此&#xff0c;有必要将目标用户的数据从FL的全局模型中有效去除&#xff0c;以降低隐私泄露的风险&#xf…

GAN对抗生成网络(一)——基本原理及数学推导

1 背景 GAN(Generative Adversarial Networks)对抗生成网络是一个很巧妙的模型&#xff0c;它可以用于文字、图像或视频的生成。 例如&#xff0c;以下就是GAN所生成的人脸图像。 2 算法思想 假如你是《古董局中局》的文物造假者&#xff08;Generator,生成器&#xff09;&a…

数字图像总复习

目录 一、第一章 二、第三章 三、第四章 四、第五章 五、第八章 六、第十章 作业一 作业二 一、第一章 1.图像文件格式由&#xff08;文件头&#xff09;及&#xff08;图像数据&#xff09;组成 2.常见的图像文件格式&#xff1a;&#xff08;JPEG&#xff09;、&…

使用Fn Connect之后,如何访问到其他程序页面?原来一直都可以!

前言 昨天小白讲过在飞牛上登录Fn Connect&#xff0c;就可以实现远程访问家里的NAS。 接着就有小伙伴咨询&#xff1a;如何远程访问到家里其他需要使用不同端口号才能访问到的软件&#xff0c;比如Jellyfin、Emby等。 这个小白在写文章的时候确实没有考虑到&#xff0c;因为…

(二)当人工智能是一个函数,函数形式怎么选择?ChatGPT的函数又是什么?

在上一篇文章中&#xff0c;我们通过二次函数的例子&#xff0c;讲解了如何训练人工智能。今天&#xff0c;让我们进一步探讨&#xff1a;面对不同的实际问题&#xff0c;应该如何选择合适的函数形式&#xff1f; 一、广告推荐系统中的函数选择 1. 业务目标 想象一下&#x…

利用3DGS中convert.py处理自采数据

前言 3DGS源码中convert.py提供对自采数据集的处理&#xff0c;需要预先安装Colmap和ImageMagick. ubuntu22.04安装colmap 点击进入NVIDIA官网&#xff0c;查看GPU的CMAKE_CUDA_ARCHITECTURES 1、克隆colmap源码&#xff0c;并进入colmap文件夹 git clone https://github.c…

硬件设计-关于ADS54J60的校准问题

目录 简介: 校准模分析: 交错的优势 交错挑战 S/2 fIN处产生杂散。失调不匹配杂散很容易识别,因为只有它位于fS/2处,并可轻松地进行补偿。增益、时序和带宽不匹配都会在输出频谱的fS/2 fIN 处产生杂散;因此,随之而来的问题是:如何确定它们各自的影响。图8以简单的…

什么是神经网络?神经网络的基本组成部分训练神经网络激活函数有哪些局限性和挑战

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

感恩相伴,蓝凌向新成长!一起拥抱数智2025

2024&#xff0c;数字中国&#xff0c;向新奔跑&#xff01;千行百业拥抱数字化、人工智能&#xff0c;蓝凌继续践行“让组织更智慧”的使命&#xff0c;与客户、伙伴等共创共赢&#xff0c;引领中国数智化办公创新发展。感恩相伴24载&#xff0c;让我们一起拥抱数智2025&#…