当前位置: 首页 > news >正文

使用Qt实现实时数据动态绘制的折线图示例

基于Qt的 QChartView 和定时器来动态绘制折线图。它通过动画的方式逐步将数据点添加到图表上,并动态更新坐标轴的范围,提供了一个可以实时更新数据的折线图应用。以下是对代码的详细介绍及其功能解析:
在这里插入图片描述

代码概述

该程序使用Qt的 QChartView 作为图表绘制的基础,结合 QLineSeriesQSplineSeries 来绘制折线或样条曲线。程序通过定时器 (QTimer) 控制数据点的动态绘制,并在绘图过程中实时更新坐标轴的显示范围。

主要功能
  • 动态创建系列:可以动态创建多个曲线系列(QLineSeriesQSplineSeries),每个系列对应一条折线或样条曲线。
  • 动态添加数据点:通过 addPointAnimated() 函数,可以为每个系列动态添加数据点,并通过动画效果逐步连接新数据点。
  • 定时更新:使用 QTimer 每隔一段时间调用 animateDrawing() 函数,逐步将新点连接到已有的曲线上。
  • 自动调整坐标轴范围:在绘制过程中,如果新点超出了当前坐标轴范围,坐标轴会自动调整以适应新的数据点。

代码结构

1. DynamicChart 类构造函数
DynamicChart::DynamicChart(QWidget *parent): QChartView(new QChart(), parent), m_chart(this->chart())
{m_chart->setTitle("Dynamic Data Plot");m_chart->legend()->hide();setRenderHint(QPainter::Antialiasing);// 设置图表主题和隐藏图例m_chart->setTheme(QChart::ChartTheme::ChartThemeDark);// 创建共用的坐标轴axisX = new QValueAxis();axisX->setRange(0, 100);m_chart->addAxis(axisX, Qt::AlignBottom);axisY = new QValueAxis();axisY->setRange(0, 100);m_chart->addAxis(axisY, Qt::AlignLeft);// 设置定时器connect(&timer, &QTimer::timeout, this, &DynamicChart::animateDrawing);timer.setInterval(30); // 动画更新间隔为30毫秒resize(500,500);
}

该构造函数中设置了图表的主题、坐标轴、以及定时器,定时器的作用是每隔30毫秒触发 animateDrawing() 函数,用于动态绘制数据。

2. createSeries() 函数
void DynamicChart::createSeries(int seriesId, const QString &name)
{
#ifdef LINEQLineSeries *series = new QLineSeries();
#elseQSplineSeries *series = new QSplineSeries();
#endifseries->setName(name);m_chart->addSeries(series);// 使用共用的坐标轴series->attachAxis(axisX);series->attachAxis(axisY);seriesMap.insert(seriesId, series);
}

该函数负责创建新的系列(折线或样条曲线),并将其添加到图表中。 seriesId 用于标识不同的曲线,name 则用于显示系列的名称。系列将共享同一套坐标轴。

3. addPointAnimated() 函数
void DynamicChart::addPointAnimated(int seriesId, const QPointF &point)
{if (!seriesMap.contains(seriesId)) return;
#ifdef LINEQLineSeries *series = seriesMap[seriesId];
#elseQSplineSeries *series =seriesMap[seriesId];
#endifif (!series->points().isEmpty()) {lastPoint = series->points().last();} else {lastPoint = point; // 第一个点直接添加series->append(point);}newPoint = point;currentSeriesId = seriesId;currentStep = 0;stepsCount = 10; // 分10步完成连线timer.start();
}

该函数用于为指定的系列添加新点,并通过动画效果使新点逐步出现在图表上。它会计算新点与最后一个点之间的插值,并逐步绘制曲线。

4. animateDrawing() 函数
void DynamicChart::animateDrawing()
{
#ifdef LINEQLineSeries *series = seriesMap[currentSeriesId];
#elseQSplineSeries *series =seriesMap[currentSeriesId];
#endifif (currentStep >= stepsCount) {timer.stop();series->append(newPoint);return;}qreal x = lastPoint.x() + (newPoint.x() - lastPoint.x()) * currentStep / stepsCount;qreal y = lastPoint.y() + (newPoint.y() - lastPoint.y()) * currentStep / stepsCount;series->append(x, y);// 动态更新坐标轴if (x > axisX->max()) {axisX->setMax(x + 10);}if (y > axisY->max() || y < axisY->min()) {axisY->setMax(qMax(y + 10, axisY->max()));axisY->setMin(qMin(y - 10, axisY->min()));}currentStep++;
}

该函数实现了通过定时器触发的动态绘制。它逐步将新点与前一个点连接,并动态调整坐标轴的范围以适应新增数据。

主窗口逻辑

最后的代码片段展示了如何使用 DynamicChart 类创建一个包含多个曲线的图表,并通过按钮控制定时器的启动与停止:

setMinimumSize(QSize(800,500));
chartView = new DynamicChart(this);
chartView->createSeries(1, "Test Series 1");
chartView->createSeries(2, "Test Series 2");
chartView->createSeries(3, "Test Series 3");
chartView->createSeries(4, "Test Series 4");QTimer *timer = new QTimer;
connect(timer, &QTimer::timeout, this, [=]()
{int m_id = QRandomGenerator::global()->bounded(1, 5);chartView->addPointAnimated(m_id, QPointF(m_index++, QRandomGenerator::global()->bounded(100)));
});startButton = new QRadioButton("StartDrawing", this);
connect(startButton, &QRadioButton::clicked, [=](bool arg)
{if (arg)timer->start(100);elsetimer->stop();
});

通过 QRadioButton 控制定时器的启停,点击按钮后,程序将开始在图表上随机添加点,并动态绘制折线或样条曲线。

结论

此程序通过Qt的 QChartView 和定时器,实现了一个能够动态绘制多条曲线的折线图表。通过定时器控制数据点的逐步绘制,并结合坐标轴的动态更新,使得该图表在绘图过程中能够自动适应数据的变化。这种方式适用于需要实时显示数据变化的场景,如传感器数据的实时监控或动态性能分析等。

相关文章:

使用Qt实现实时数据动态绘制的折线图示例

基于Qt的 QChartView 和定时器来动态绘制折线图。它通过动画的方式逐步将数据点添加到图表上&#xff0c;并动态更新坐标轴的范围&#xff0c;提供了一个可以实时更新数据的折线图应用。以下是对代码的详细介绍及其功能解析&#xff1a; 代码概述 该程序使用Qt的 QChartView…...

【人人保-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

Redis6 多线程模型

优质博文&#xff1a;IT-BLOG-CN 一、单线程的优缺点 对于一个请求操作Redis主要做3件事情&#xff1a;从客户端读取数据/解析、执行Redis命令、回写数据给客户端。所以主线程其实就是把所有操作的这3件事情串行一起执行&#xff0c;因为是基于内存&#xff0c;所以执行速度非…...

Python的异步编程

什么是协程&#xff1f; 协程不是计算机系统提供&#xff0c;程序员人为创造。 协程也可以被称为微线程&#xff0c;是一种用户态内的上下文切换技术。简而言之&#xff0c;其实就是通过一个线程实现代码块相互切换执行。 实现协程有那么几种方法&#xff1a; greenlet&…...

初识Linux · 进程等待

目录 前言&#xff1a; 进程等待是什么 为什么需要进程等待 进程等待都在做什么 前言&#xff1a; 通过上文的学习&#xff0c;我们了解了进程终止&#xff0c;知道终止是在干什么&#xff0c;终止的三种情况&#xff0c;以及有了退出码&#xff0c;错误码的概念&#xff…...

面向对象建模

UML 关系 UML 关系主要有&#xff1a;依赖、关联、聚合、组合、实现、继承。 类图 #mermaid-svg-jcAjcVcPmgmWDpcI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jcAjcVcPmgmWDpcI .error-icon{fill:#552222;}#m…...

MetaJUI v0.4 遇到的一些问题及解决办法记录

1、Unity3d 版本 2022.3.29f1。 2、MetaJUI v0.4 的下载&#xff0c;https://download.csdn.net/download/xingchengaiwei/89334848 3、将MetaJUI v0.4解压&#xff0c;用Unity3d 打开项目&#xff0c;会出现如下问题&#xff0c;按照图中提示操作即可。 4、打开工程后会出现…...

从零开始学习OMNeT++系列第二弹——新建一个OMNeT++的工程

上一篇第一弹介绍了OMNeT是什么以及如何安装OMNeT&#xff0c;现在来说一下如何新建一个自己的OMNeT的工程。 在 Omnet安装完成后&#xff0c;samples/tictoc 中有该例子的完整文件&#xff0c;你可以立刻运行该文件看他是怎么工作的&#xff0c;不过更推荐按接下来的步骤一步…...

【Android】布局优化—include,merge,ViewStub的使用方法

引言 1.重要性 在Android应用开发中&#xff0c;布局是用户界面的基础。一个高效的布局不仅能提升用户体验&#xff0c;还能显著改善应用的性能。随着应用功能的复杂性增加&#xff0c;布局的优化变得尤为重要。优化布局能够减少渲染时间&#xff0c;提高响应速度&#xff0c…...

传奇外网架设教程带图文解说—Gee引擎

架设前准备工作&#xff1a; ①通过百度网盘下载版本、补丁、客户端和DBC2000。版本解压到D盘&#xff0c;客户端解压到D盘或是E盘&#xff0c;补丁先不解压 ②安装和配置DBC2000&#xff0c;有些版本不一定用的是DBC2000数据库&#xff0c;看引擎默认的数据库是哪个 DBC数据…...

MySQL | excel数据输出insert语句

需求 在日常生产运维过程中&#xff0c;有很多需要进行人工梳理的excel数据&#xff0c;到了研发这一侧需要转为sql语句进行数据修正&#xff0c;如何输出insert插入语句&#xff1f; 方案 在空白列插入&#xff0c;选择需要的列 "INSERT INTO tab_name1 (name, desc) …...

足球青训俱乐部管理:Spring Boot技术驱动

摘 要 随着社会经济的快速发展&#xff0c;人们对足球俱乐部的需求日益增加&#xff0c;加快了足球健身俱乐部的发展&#xff0c;足球俱乐部管理工作日益繁忙&#xff0c;传统的管理方式已经无法满足足球俱乐部管理需求&#xff0c;因此&#xff0c;为了提高足球俱乐部管理效率…...

一次实践:给自己的手机摄像头进行相机标定

文章目录 1. 问题引入2. 准备工作2.1 标定场2.2 相机拍摄 3. 基本原理3.1 成像原理3.2 畸变校正 4. 标定解算4.1 代码实现4.2 详细解析4.2.1 解算实现4.2.2 提取点位 4.3 解算结果 5. 问题补充 1. 问题引入 不得不说&#xff0c;现在的计算机视觉技术已经发展到足够成熟的阶段…...

【docker学习】Linux系统离线方式安装docker环境方法

centos7-linux安装docker(离线方式) 下载docker的安装文件 https://download.docker.com/linux/static/stable/x86_64/ 下载的是&#xff1a;docker-18.06.3-ce.tgz 这个压缩文件 将docker-18.06.3-ce.tgz文件上传到centos7-linux系统上&#xff0c;用ftp工具上传即可 解压…...

vscode开发uniapp安装插件指南

安装vuets的相关插件 首先是vue的相关插件&#xff0c;目前2024年9月应该是vue-offical 安装uniapp开发插件 uni-create-view &#xff1a;快速创建 uni-app 页面 安装uni-create-view之后修改插件拓展设置 勾选第一个选择创建视图时创建同名文件夹 选择第二个创建文件夹中生…...

Elasticsearch7.7.1集群不能相互发现的问题解决以及Elasticsearch7.7.1安装analysis-ik中文分词插件的应用

一、Elasticsearch7.7.1集群不能相互发现的问题解决 在使用elasticsearch7.7.1搭建集群&#xff0c;使用了3台服务器作为节点&#xff0c;但在搭建的过程中发现每台服务器的elasticsearch服务都正常&#xff0c;但是不能相互发现&#xff0c;期间进行了一些配置的修改偶尔出现了…...

蓝牙Mesh介绍

蓝牙Mesh&#xff08;Bluetooth Mesh&#xff09;是一种基于蓝牙技术的无线通信网络拓扑&#xff0c;用于在设备之间创建大规模的多点到多点网络。蓝牙Mesh网络可以让多个蓝牙设备相互通信和协作&#xff0c;适合需要高覆盖范围和高可靠性的场景&#xff0c;例如智能家居、工业…...

Qt 窗口中鼠标点击事件的坐标探讨

// 鼠标点击事件 void Widget::mousePressEvent(QMouseEvent *event) {/*event->pos()、event->windowPos()和event->localPos()都表示鼠标点击位置在窗口中的位置&#xff0c;它们的值都是一样的&#xff0c;区别在于event->pos()是QPoint类型&#xff0c;event-&…...

服务器虚拟化的全面指南

1. 引言 在数字化转型的浪潮中&#xff0c;服务器虚拟化成为现代IT基础设施的核心组成部分。它通过将物理服务器资源分割成多个虚拟资源&#xff0c;极大地提高了资源利用率和灵活性。本篇文章将深入探讨服务器虚拟化的概念、优势、挑战、技术工具、最佳实践及未来发展趋势。 …...

Linux启动mysql报错

甲方公司意外停电&#xff0c;所有服务器重启后&#xff0c;发现部署在Linux上的mysql数据库启动失败.再加上老员工离职&#xff0c;新接手项目&#xff0c;对Linux系统了解不多&#xff0c;解决起来用时较多&#xff0c;特此记录。 1.启动及报错 1.1 启动语句1 启动语句1&a…...

基于大数据的二手房价数据可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

C++模拟实现vector容器【万字模拟✨】

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 数据结构与算法_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff…...

论文笔记:LAFF 文本到视频检索的新基准

整理了ECCV2022 Lightweight Attentional Feature Fusion: A New Baseline for Text-to-Video Retrieval 论文的阅读笔记 背景模型问题定义LAFF(Lightweight Attention Feature Fusion)LAFF Block 实验消融实验可视化对比试验 这篇文章提出了一种新颖灵活的特征融合方式&#x…...

iSTFT 完美重构的条件详解

目录 引言1. 短时傅里叶变换&#xff08;STFT&#xff09;与逆变换&#xff08;iSTFT&#xff09;概述2. 完美重构的条件3. 数学推导4. 实现要点5. 示例代码6. 总结 引言 在数字信号处理领域&#xff0c;短时傅里叶变换&#xff08;Short-Time Fourier Transform&#xff0c;简…...

SSH(安全外壳协议)可以基于多种加密算法

SSH&#xff08;安全外壳协议&#xff09;可以基于多种加密算法&#xff0c;确保数据的机密性和完整性。以下是 SSH 中常见的加密类型&#xff1a; 1. 对称加密 对称加密算法用于加密会话中的数据&#xff0c;常见的算法包括&#xff1a; AES&#xff08;高级加密标准&#…...

Navicat 工具 下载安装

准备工作 下载 下载链接&#xff1a;https://www.123865.com/ps/EF7OTd-kdAnH 演示环境 操作系统&#xff1a;windows10 产品&#xff1a;Navicat 版本&#xff1a; 15.0.25 注意&#xff1a;如果需要其他版本可以自行下载。 安装步骤 1、解压&#xff08;如果解压中出现提示…...

家用高清投影仪怎么选?目前口碑最好的投影仪推荐

双十一马上要到了&#xff0c;而且今年还有投影仪的家电国补&#xff0c;所以大家入手投影仪的需求也越来越多&#xff0c;但是家用高清投影仪怎么选&#xff1f;什么投影仪最适合家用&#xff1f;家庭投影仪哪个牌子质量最好&#xff1f;今天就给大家做一个2024性价比高的家用…...

阿里云盾同步漏洞之限制请求数

阿里云sdk不支持一次性请求太多&#xff0c;所以我们需要限制每次请求最大1000条&#xff0c;此代码无任何参考意义。仅做记录 func VulList(hole_type string) ([]*sas20181203.DescribeVulListResponseBodyVulRecords, error) {pageSize : 20allItems : make([]*sas20181203…...

docker安装kafka-manager

kafkamanager docker安装_mob64ca12d80f3a的技术博客_51CTO博客 # 1、拉取镜像及创建容器 docker pull hlebalbau/kafka-manager docker run -d --name kafka-manager -p 9000:9000 --networkhost hlebalbau/kafka-manager# 2、增设端口 腾讯云# 3、修改防火墙 sudo firewall-…...

Android Studio 新版本 Logcat 的使用详解

点击进入官方Logcat介绍 一个好的Android程序员要会使用AndroidStudio自带的Logcat查看日志&#xff0c;会Log定位也是查找程序bug的第一关键。同时Logcat是一个查看和处理日志消息的工具&#xff0c;它可以更快的帮助开发者调试应用程序。 步入正题&#xff0c;看图说话。 点…...

做擦边网站 服务器/google免登录网页版

课程首页地址&#xff1a;http://blog.csdn.net/sxhelijian/article/details/7910565&#xff0c;本周题目链接&#xff1a;http://blog.csdn.net/sxhelijian/article/details/8635385【项目3-用结构体数组作计算】接项目2&#xff0c;&#xff08;1&#xff09;从文件中读出数…...

dede 添加演示网站/怎么申请域名建立网站

目录&#xff08;1&#xff09;对于异步 I/O 操作的需求&#xff08;2&#xff09;异步 I/O API超时处理结果的顺序事件时间容错保证&#xff08;3&#xff09;代码实现&#xff08;1&#xff09;对于异步 I/O 操作的需求 在与外部系统交互&#xff08;用数据库中的数据扩充流…...

2003服务器建设网站/网络营销公司是做什么的

TypeScript是一门开源的&#xff0c;由微软开发维护的&#xff0c;发布于2012年10月的静态类型的语言&#xff1b; 他是ECMAScript的超集&#xff0c;支持JavaScript的所有语法和语义&#xff0c;并且在此基础之上提供了更多额外的特性&#xff0c;例如静态类型和更丰富的语法。…...

网站管理系统源码/关键词排名查询官网

把 Windows 下的应用部署到 Linux 下&#xff0c;使用到了 Quartz 集群的特性&#xff0c;所以建了 MySql 的中间表&#xff0c;一启动看到报错&#xff1a; Invocation of init method failed; nested exception is org.quartz.JobPersistenceException: Couldnt retrieve tri…...

现在在市场上做网站怎么样/百度关键词挖掘查排名工具

CSS美化INPUT placeholder效果。CSS代码美化文本框里的placeholder文字。 ::selection伪元素 简而言之&#xff1a;单冒号(:)用于CSS3伪类&#xff0c;双冒号(::)用于CSS3伪元素。 伪元素由双冒号和伪元素名称组成。双冒号是在当前规范中引入的&#xff0c;用于区分伪类和伪元素…...

购物网站asp源码/营销策划与运营团队

如何区分垃圾 上面说到的“引用计数”法&#xff0c;通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以&#xff0c;后来实现的垃圾判断算法中&#xff0c;都是从程序运行的根节点出发&#xff0c;遍历…...