Qt画实时曲线图

Qt引入QcustomPlot

首先下载QcustomPlot源代码,https://github.com/qcustomplot/qcustomplot

下载zip文件

运行所下载的项目生成库文件libqcustomplotd2.a文件和qcustomplotd2.dll文件。

在项目中添加printsupport。

并将qcustomplot.h文件和qcustomplot.cpp文件添加到项目,另外将库文件复制到项目中。

在项目ui 中拖出一个widget并提升为QCustomPlot接下来我们引入customplot.h文件进行画图。

ui->customPlot->xAxis->setVisible(true); // 隐藏X轴ui->customPlot->yAxis->setVisible(true); // 隐藏Y轴ui->customPlot->xAxis->setTickLabels(true); // 隐藏X轴的刻度标签ui->customPlot->yAxis->setTickLabels(true); // 隐藏Y轴的刻度标签ui->customPlot->legend->setVisible(true);QSharedPointer<QCPAxisTickerDateTime> timeTicker(new QCPAxisTickerDateTime);//ui->customPlot->xAxis->setTickLabelType(QCPAxis::ltDateTime);timeTicker->setDateTimeFormat("yyyy-MM-dd HH:mm:ss"); // 设置时间格式ui->customPlot->xAxis->setTicker(timeTicker);ui->customPlot->graph(0)->setData(timee, i);ui->customPlot->graph(0)->setName("电流曲线");//ui->customPlot->graph(0)->setWidth(5);ui->customPlot->graph(1)->setData(timee, v);ui->customPlot->graph(1)->setName("电压曲线");ui->customPlot->rescaleAxes();ui->customPlot->xAxis->setLabel("时间轴");ui->customPlot->yAxis->setRange(0,150);ui->customPlot->replot();QObject::connect(ui->customPlot, &QCustomPlot::mousePress, [&](QMouseEvent *event){// 当前鼠标位置(像素坐标)int x_pos = event->pos().x();int y_pos = event->pos().y();//鼠标坐标转化为CustomPlot内部坐标int x_val = ui->customPlot->xAxis->pixelToCoord(x_pos);int y_val = ui->customPlot->yAxis->pixelToCoord(y_pos);QString str,strToolTip;str = QString::number(x_val);strToolTip += "时间: ";strToolTip += QDateTime::fromTime_t(x_val).toString("yyyy-MM-dd hh:mm:ss");strToolTip += "\n";int index=keyIndexMap[x_val];//qDebug()<<x_val<<index;int y=ui->customPlot->graph(0)->data()->at(index)->value;str = QString::number(y);strToolTip += "电流:";strToolTip += str;strToolTip += "\n";//qDebug()<<str;int y1=ui->customPlot->graph(1)->data()->at(index)->value;str = QString::number(y1);strToolTip += "电压:";strToolTip += str;strToolTip += "\n";QToolTip::showText(cursor().pos(), strToolTip, ui->customPlot);});}

上面显示的是曲线

timee,i,v是vector数组,timee是

timee[j]=time[j].toTime_t();

日期时间转换的毫秒数通过以下代码

QSharedPointer<QCPAxisTickerDateTime> timeTicker(new QCPAxisTickerDateTime);
        //ui->customPlot->xAxis->setTickLabelType(QCPAxis::ltDateTime);
        timeTicker->setDateTimeFormat("yyyy-MM-dd HH:mm:ss"); // 设置时间格式
        ui->customPlot->xAxis->setTicker(timeTicker);

实现在折线图中显示出日期时间。

如何显示实时曲线呢?

timer=new QTimer(this);timer->setTimerType(Qt::PreciseTimer);timer->start(1000);connect(timer,&QTimer::timeout,this,&Dialog::update);

通过定时器每隔1000ms调用update函数,上面的代码就是update函数中的部分代码。

上面代码也包括了点击按钮出现时间轴和电压,电流的数据。

QObject::connect(ui->customPlot, &QCustomPlot::mousePress, [&](QMouseEvent *event){// 当前鼠标位置(像素坐标)int x_pos = event->pos().x();int y_pos = event->pos().y();//鼠标坐标转化为CustomPlot内部坐标int x_val = ui->customPlot->xAxis->pixelToCoord(x_pos);int y_val = ui->customPlot->yAxis->pixelToCoord(y_pos);QString str,strToolTip;str = QString::number(x_val);strToolTip += "时间: ";strToolTip += QDateTime::fromTime_t(x_val).toString("yyyy-MM-dd hh:mm:ss");strToolTip += "\n";int index=keyIndexMap[x_val];//qDebug()<<x_val<<index;int y=ui->customPlot->graph(0)->data()->at(index)->value;str = QString::number(y);strToolTip += "电流:";strToolTip += str;strToolTip += "\n";//qDebug()<<str;int y1=ui->customPlot->graph(1)->data()->at(index)->value;str = QString::number(y1);strToolTip += "电压:";strToolTip += str;strToolTip += "\n";QToolTip::showText(cursor().pos(), strToolTip, ui->customPlot);});

我们通过lambda公式实现鼠标点击事件。

ui->customPlot->graph(0)->data()->at(index)->value

index是指曲线图的第几个数据,所以我们需要keyIndexMap将横坐标时间轴转换成整形数据找到是第几个点,进而获取曲线上的数值,俗称为y轴的数值。通过这样转换我们可以通过x轴时间获取y轴的数据,最后通过QToolTip显示到曲线中。

本文只是自己做的项目一个模块,就不给大家更多的代码。本文实现的是,实时曲线图,X轴是时间轴Y轴是电压和电流。

实现图像:

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

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

相关文章

如何在 C++/Qt/CMake 项目中构建 Rust 代码

问题描述 我有一个使用 CMake 构建的现有 C/Qt 项目&#xff0c;我想开始添加 Rust 代码&#xff0c;并能够从主 C 代码库中调用这些 Rust 代码。应该如何组织项目结构&#xff1f; 现有项目结构 ./CMakeLists.txt ./subproject-foo/CMakeLists.txt ./subproject-foo/src/..…

Tomcat(1)

Tomcat(1) 1.Tomcat简介 Tomcat和Nginx、Apache(http)、Web服务器一样&#xff0c;具有处理HTML面的功能&#xff0c;不过tomcat处理静态HTML能力不如nginx服务器 一个tomcat默认并发数是200(官方) 使用方案&#xff1a; nginx和tomcat配合&#xff0c;nginx处理静态&#x…

万物皆对象,你信吗?

**内存空间和数据都消失&#xff0c;数据怎么会消失的&#xff1f;**空间没了&#xff0c;数据自然也跟着消失。因为数据就是在空间里面的。就像宇宙大爆炸&#xff0c;我们还能存在嘛&#xff0c;是不是已经undefined了。「一块小内存上有2种数据类型」 内部存储的数据 地址值…

Trilium Notes浏览器插件保存网页内容到docker私有化部署

利用Trilium浏览器插件可以很方便的把网页内容保存到Trilium&#xff0c;需要先在docker部署好trilium&#xff0c;还没有部署的可以先看这篇文章&#xff1a;trilium笔记私有化部署-www.88531.cn资享网 1.下载Trilium浏览器插件&#xff1a;https://www.npspro.cn/33462.html…

高考志愿填报秘籍:工具篇

选择适合自己的大学和专业&#xff0c;对广大考生来说至关重要。从某种程度上来说&#xff0c;决定了考生未来所从事的行业和发展前景。为了帮助广大考生更加科学、合理地填报志愿&#xff0c;选择适合自己的大学和专业&#xff0c;本公众号将推出如何用AI填报高考志愿专栏文章…

Linux `screen` 命令详解与使用指南

Linux screen 命令详解与使用指南 在Linux系统中&#xff0c;screen 是一个非常有用的工具&#xff0c;它允许用户在单个终端会话中运行多个进程&#xff0c;并能在会话之间切换。screen 特别适用于远程登录&#xff08;如通过SSH&#xff09;时&#xff0c;确保即使网络连接断…

华为200人园区网有线和无线

实验描述&#xff1a; 1 内网有有线业务、内部无线、外部无线三种业误。 2 内网服务器配置静态IP&#xff0c;网关192.168.108.1。 3 sW1和R1之间使用v1an200 192.168.200.9/30 互联。 4 R2向运营商申请企业宽带并获得了1个固定公网IP&#xff1a; 200.1.1.1 子网掩码 255.255.…

JavaScript语法特性篇-空值合并运算符(??)

1、基本使用 空值合并运算符&#xff08;??&#xff09;英文名称为 Nullish coalescing operator&#xff0c;是一个逻辑运算符。 特性&#xff1a;当左侧的操作数为 null 或者 undefined 时&#xff0c;返回其右侧操作数&#xff0c;否则返回左侧操作数。 const foo nul…

Hyperf 在 NginxProxyManager 如何配置 websocket?

新建代理 填写域名等服务信息&#xff0c;选择支持WebSockets。 创建 SSL 编写nginx配置 location /message.io{proxy_pass http://<你的ip>:<对应端口号>;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upg…

ios生成随机颜色

写demo&#xff0c;太需要这个随机颜色了&#xff0c;每次都懒得写&#xff0c;从网上找&#xff0c;但是找出来的又都是良莠不齐&#xff0c;还需要再修改。 是在懒得修改&#xff0c;就找了一个合适的&#xff0c;从自己的博客找&#xff0c;减少筛选代码的成本。 OC版本 …

最新《pvz植物大战僵尸杂交版》整合安装包,全面支持Android、ios、Windows,附教程!

今天&#xff0c;阿星要聊聊最近全网大火的一款老游戏——《植物大战僵尸》杂交版。 虽然它不是什么3A大作&#xff0c;但在阿星的心里&#xff0c;它永远是那个让人回味无穷的经典。记得十年前&#xff0c;阿星和大多数玩家一样&#xff0c;玩的都是盗版。那时候的《植物大战…

MES管理系统中的仓库管理功能有哪些用途

在当今制造业迅猛发展的背景下&#xff0c;企业对于车间生产调度的需求日益迫切。为此&#xff0c;MES管理系统应运而生&#xff0c;它作为一款专注于车间生产调度的管理信息系统&#xff0c;正逐步成为制造业提升生产效率、优化资源配置的利器。特别是其在仓储和物流管理方面的…

YOLOv8进行对象检测与关键点定位:实时计算关键点间实际距离并可视化

主要功能如下&#xff1a; 该脚本主要实现了使用预训练的YOLO模型对输入图片进行对象检测与关键点定位&#xff0c;计算特定关键点之间的实际距离&#xff0c;并在图片上可视化这些信息&#xff08;包括边界框、关键点标记、实际距离文字标注&#xff09;&#xff0c;最后保存…

解决Java中的IllegalThreadStateException异常的方法

解决Java中的IllegalThreadStateException异常的方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;IllegalThreadStateException异…

代码随想录-Day38

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …

计算机基础——经典排序算法总结

1.选择排序 找到数组中最小的那个元素&#xff0c;其次&#xff0c;将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。其次&#xff0c;在剩下的元素中找到最小的元素&#xff0c;将它与数组的第二个元素交换位置。如此往复&#xff0c;直到将…

[已解决] AI2THOR-2.1.0的卡死问题

在使用一些数据集的时候&#xff0c;例如ALFRED&#xff0c;需要调用AI2THOR-2.1.0版本。调用如下的测试脚本测试AI2THOR-2.1.0的安装情况&#xff1a; from ai2thor.controller import Controllerc Controller() c.start() event c.step(dict(action"MoveAhead")…

01 Swift 基础语法(变量,常量,注释,整数,浮点数,元组)

Swift 介绍 Swift 是一门用于开发 iOS、macOS、watchOS 和 tvOS 应用的新编程语言。它以安全、快速和互动的特点而著称。Swift 提供了代码预览&#xff08;playgrounds&#xff09;功能&#xff0c;使程序员可以在不编译和运行应用程序的情况下&#xff0c;实时运行 Swift 代码…

React面试题(二)

说说React的事件机制 是什么 React基于浏览器的事件机制自身实现了一套事件机制&#xff0c;包括事件注册&#xff0c;事件的合成&#xff0c;事件派发等 在React中这套事件机制被称之为合成事件 合成事件&#xff08;SyntheicEvent&#xff09; 合成事件是React模拟原生DO…

如何实现CloudFlare免费内网穿透?

有时候我们可能需要用到内网穿透技术,将本机的资源开放到网络上供人访问! 但是有时候我们只需要将一个项目开放的时候,使用frp就有点不划算了,特别是近几年服务器的价格水涨船高,要知道使用frp需要一台服务器和一个域名才可以的,这不今天就告诉大家一个用cloudflare实现…