041-第三代软件开发-QCustcomPlot波形标注

头图

第三代软件开发-QCustcomPlot波形标注

文章目录

  • 第三代软件开发-QCustcomPlot波形标注
    • 项目介绍
    • QCustcomPlot波形标注
      • 效果
      • 初始化
      • 绘制

关键字: QtQml关键字3关键字4关键字5

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏在第三代软开发更新完将涨价

QCustcomPlot波形标注

效果

先看看效果,如果抓取到波形,就会在对应的曲线上标注出起点,最高点和最低点,如下图所示。

image-20230807225118468

嘿嘿嘿,不管你是之前就看过,还是从上一篇中了解到了第一个波形的检测方法,在哪里面你应该看到部分QCustcomPlot波形标注的内容,今天咱们这个其实原理还是那个原理,试试今天的这个标注的有点多了。

链接在这里:https://dreamlife.blog.csdn.net/article/details/128716820

image-20230807183545114

初始化

下面的代码没有啥技术含量就是把我们需要用到的控件全部都给它初始化了,完了再隐藏了,这样在默认没有抓到波形的情况下,就是没有的,对于用户来说是不知道我们做了啥操作的。

/*** @brief XXXX::initWavesCatched 初始化幅值*/
void XXXX::initWavesCatched()
{/// 数据推平抓取到波形信号if(m_dataChannel == 1){connect(m_turing_ElectroPhysiology->g_turing_ElectroPhysiologyPullData,&Turing_ElectroPhysiologyPullData::signal_wavesCatched,this,&XXXX::slot_wavesCatched);}else if(m_dataChannel == 2){connect(m_turing_ElectroPhysiology->g_turing_ElectroPhysiologyPullData,&Turing_ElectroPhysiologyPullData::signal_wavesCatched,this,&XXXX::slot_wavesCatched);}QPen pen;pen.setColor("#2DAAE1");pen.setWidth(2);pen.setStyle(Qt::SolidLine);m_labelTime = new QCPItemText(m_qCustomPlot);m_labelTime->setLayer("overlay");m_labelTime->setClipToAxisRect(false);m_labelTime->setPadding(QMargins(5, 5, 5, 5));m_labelTime->setFont(QFont("宋体", 16));m_labelTime->setColor(QColor("#2DAAE1"));m_labelTime->setVisible(false);m_lineTime = new QCPItemLine(m_qCustomPlot);m_lineTime->setPen(pen);m_lineTime->setLayer("overlay");m_lineTime->setClipToAxisRect(false);m_lineTime->setVisible(false);m_lineStart = new QCPItemLine(m_qCustomPlot);m_lineStart->setPen(pen);m_lineStart->setLayer("overlay");m_lineStart->setClipToAxisRect(false);m_lineStart->setVisible(false);m_lineMax = new QCPItemLine(m_qCustomPlot);m_lineMax->setPen(pen);m_lineMax->setLayer("overlay");m_lineMax->setClipToAxisRect(false);m_lineMax->setVisible(false);m_lineMin = new QCPItemLine(m_qCustomPlot);m_lineMin->setPen(pen);m_lineMin->setLayer("overlay");m_lineMin->setClipToAxisRect(false);m_lineMin->setVisible(false);m_labelAmplitude = new QCPItemText(m_qCustomPlot);m_labelAmplitude->setLayer("overlay");m_labelAmplitude->setClipToAxisRect(false);m_labelAmplitude->setPadding(QMargins(5, 5, 5, 5));m_labelAmplitude->setFont(QFont("宋体", 16));m_labelAmplitude->setColor(QColor("#2DAAE1"));m_labelAmplitude->setVisible(false);m_lineAmplitudeTop = new QCPItemLine(m_qCustomPlot);m_lineAmplitudeTop->setPen(pen);m_lineAmplitudeTop->setLayer("overlay");m_lineAmplitudeTop->setClipToAxisRect(false);m_lineAmplitudeTop->setVisible(false);m_lineAmplitudeBottom = new QCPItemLine(m_qCustomPlot);m_lineAmplitudeBottom->setPen(pen);m_lineAmplitudeBottom->setLayer("overlay");m_lineAmplitudeBottom->setClipToAxisRect(false);m_lineAmplitudeBottom->setVisible(false);}

绘制

经过上面的初始化,这里我们使用了Qt 的经典之一,信号槽,还记得上篇中组后,如果我们抓到波形就会触发一个信号,那个信号连接的槽就是这个函数,这个函数的作用就是根据上篇中的波形坐标,把对应的线,箭头,数据绘制在上面

/*** @brief XXXX::slot_wavesCatched  算法波形画图* @param chanelIndex* @param startIndex* @param crestIndex* @param troughIndex* @param endIndex*/
void XXXX::slot_wavesCatched(int chanelIndex, int startIndex, int crestIndex, int troughIndex, int endIndex)
{
//    qDebug() << "slot_wavesCatched 1 " << chanelIndex;if(startIndex == crestIndex){closeWavesCatched();return;}if(chanelIndex +1 != m_dataChannel)return;// 分别计算 x、y 单位像素大小// 获取 x 轴对象// 获取 x 轴范围// 获取绘图区域大小// 计算单位像素大小m_xPixelSize = m_qCustomPlot->xAxis->range().size() / m_qCustomPlot->viewport().width();m_yPixelSize = m_qCustomPlot->yAxis->range().size() / m_qCustomPlot->viewport().height();m_yStartValue= m_qCustomPlot->graph(0)->data()->at(startIndex)->value;m_yCrestValue= m_qCustomPlot->graph(0)->data()->at(crestIndex)->value;m_yTroughValue= m_qCustomPlot->graph(0)->data()->at(troughIndex)->value;
//    double yEndValue= m_qCustomPlot->graph(chanelIndex)->data()->at(endIndex)->value;//    qDebug() << "m_yCrestValue" << m_yCrestValue << "m_yTroughValue" << m_yTroughValue;m_yCrestValue= m_qCustomPlot->graph(0)->data()->at(crestIndex)->value;m_yTroughValue= m_qCustomPlot->graph(0)->data()->at(troughIndex)->value;m_lineStart->setVisible(true);m_lineStart->start->setCoords(startIndex,m_yStartValue);m_lineStart->end->setCoords(startIndex,m_yStartValue-100*m_yPixelSize);if(startIndex-100*m_xPixelSize > 0){m_labelTime->setVisible(true);setStimDelay((startIndex + m_turing_ElectroPhysiology->g_turing_ElectroPhysiologyPullData->g_userProfile->stimMaskDelay())*0.125);m_labelTime->setText(QString::number((startIndex + m_turing_ElectroPhysiology->g_turing_ElectroPhysiologyPullData->g_userProfile->stimMaskDelay())*0.125, 'f', 1) + "ms");m_labelTime->position->setCoords(startIndex-100*m_xPixelSize, m_yStartValue-50*m_yPixelSize);m_lineTime->setVisible(true);m_lineTime->start->setParentAnchor(m_labelTime->right);m_lineTime->end->setCoords(startIndex-1,m_yStartValue-50*m_yPixelSize);m_lineTime->setHead(QCPLineEnding::esSpikeArrow);//设置箭头类型(三角形、菱形、方形等)}else{m_labelTime->setVisible(true);setStimDelay((startIndex + m_turing_ElectroPhysiology->g_turing_ElectroPhysiologyPullData->g_userProfile->stimMaskDelay())*0.125);m_labelTime->setText(QString::number((startIndex + m_turing_ElectroPhysiology->g_turing_ElectroPhysiologyPullData->g_userProfile->stimMaskDelay())*0.125,'f',1) + "ms");m_labelTime->position->setCoords(startIndex+50*m_xPixelSize, m_yStartValue-50*m_yPixelSize);m_lineTime->setVisible(true);m_lineTime->start->setParentAnchor(m_labelTime->left);m_lineTime->end->setCoords(startIndex+1,m_yStartValue-50*m_yPixelSize);m_lineTime->setHead(QCPLineEnding::esSpikeArrow);//设置箭头类型(三角形、菱形、方形等)}if(crestIndex <troughIndex){m_lineMax->setVisible(true);m_lineMax->start->setCoords(crestIndex,m_yCrestValue);m_lineMax->end->setCoords(endIndex,m_yCrestValue);m_lineMin->setVisible(true);m_lineMin->start->setCoords(crestIndex,m_yTroughValue);m_lineMin->end->setCoords(endIndex,m_yTroughValue);}else{m_lineMax->setVisible(true);m_lineMax->start->setCoords(troughIndex,m_yCrestValue);m_lineMax->end->setCoords(endIndex,m_yCrestValue);m_lineMin->setVisible(true);m_lineMin->start->setCoords(troughIndex,m_yTroughValue);m_lineMin->end->setCoords(endIndex,m_yTroughValue);}m_labelAmplitude->setVisible(true);m_labelAmplitude->setText(QString("%1uV").arg(int(m_yCrestValue - m_yTroughValue)));m_labelAmplitude->position->setCoords(troughIndex, (m_yCrestValue + m_yTroughValue)/2);m_lineAmplitudeTop->setVisible(true);m_lineAmplitudeTop->start->setParentAnchor(m_labelAmplitude->top);m_lineAmplitudeTop->end->setCoords(troughIndex,m_yCrestValue-1);m_lineAmplitudeTop->setHead(QCPLineEnding::esSpikeArrow);//设置箭头类型(三角形、菱形、方形等)m_lineAmplitudeBottom->setVisible(true);m_lineAmplitudeBottom->start->setParentAnchor(m_labelAmplitude->bottom);m_lineAmplitudeBottom->end->setCoords(troughIndex,m_yTroughValue+1);m_lineAmplitudeBottom->setHead(QCPLineEnding::esSpikeArrow);//设置箭头类型(三角形、菱形、方形等)m_qCustomPlot->replot(QCustomPlot::rpQueuedReplot);}

博客签名2021

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

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

相关文章

内衣迷你洗衣机什么牌子好?选购内衣裤洗衣机的方法

在如今的这个年代&#xff0c;大多数的用户由于种种原因&#xff0c;连洗自身的内衣裤以及袜子都不想洗。然而内衣裤洗衣机作为近来比较火的小家电&#xff0c;网友的评价褒贬不一&#xff0c;有人说“买来就是鸡肋&#xff0c;用起来不方便”&#xff0c;“也有人买了后直呼真…

EasyCVR智能边缘网关用户信息泄漏漏洞

EasyCVR智能边缘网关用户信息泄漏漏洞 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: title"EasyCVR" 漏洞复现1. 构造poc2. 获取管理员账户密码3. 登录后台 免责声明 仅用于技术交流,目的是向相关安全人员展示漏洞利用方式,以便更好地提高网络安全意识和技术水平…

办公必备神器:如何用AI快速生成年终总结PPT?

2023年已经步入尾声&#xff0c;今年的销售业绩如何&#xff1f;用户同比增长率是否达到预期&#xff1f;部门年度API完成情况&#xff1f;新开发的项目进展如何&#xff1f;品牌全球计划在各区域市场的部署进展&#xff1f;…… 每年年底&#xff0c;不论是纵横全球的大企业&…

开发环境配置之Linux安装golang

Linux安装golang 目录 1. 下载Go发行版2. 配置工作空间3. 版本升级 1. 下载Go发行版 从官方地址&#xff1a;https://golang.org/dl/ 上下载合适的 二进制发行版 可以使用wget、curl等工具下载具体的go的发行版。 wget https://go.dev/dl/go1.21.3.linux-amd64.tar.gz接着…

Android---底层剖析 Window、Activity、View 三者关系

对于一个 Android 工程师来讲&#xff0c;或多或少都听说过 Window 的概念&#xff0c;并且隐约感受到它在 Activity 和 View 之间应该发挥着某种连接的作用。但如果要说出这三者之间的关系&#xff0c;多数 android 工程师都不知道从何下手。 Activity 的 setContentView Ac…

VScode远程连接错误:进程试图写入不存在的管道

使用VScode连接树莓派时&#xff0c;出现远程连接错误&#xff1a;进程试图写入不存在的管道 解决方案&#xff1a; &#xff08;1&#xff09;可以进入config所在文件夹&#xff0c;删除文件 &#xff08;2&#xff09;无法解决的化尝试下述方法 输入 Remotting-SSH:Settin…

自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮

自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮 自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮 <template><div class"box"><el-table :data"msgMapList" border class"table">&l…

Java入门篇 之 逻辑控制(练习题篇)

博主碎碎念: 练习题是需要大家自己打的请在自己尝试后再看答案哦&#xff1b; 个人认为&#xff0c;只要自己努力在将来的某一天一定会看到回报&#xff0c;在看这篇博客的你&#xff0c;不就是在努力吗&#xff0c;所以啊&#xff0c;不要放弃&#xff0c;路上必定坎坷&#x…

c++ Vector 学习

vevtor 是c 中自带得动态数组&#xff0c;dynamic array array can hold different values/objects of same type 可以装不同得类型或者对象 dynamic size can be changed at runtime 可以运行得时候改变 要使用的话&#xff0c;先引入 #include <vector> std::vector…

Kafka基本原理、生产问题总结及性能优化实践 | 京东云技术团队

Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&a…

Mac 解决 APP 快捷键冲突

打开 Mac 系统设置键盘->键盘快捷键->App快捷键->添加快捷键&#xff08;加号&#xff09;->标题需要和tab名称完全一致&#xff08;包括中英文、标点符号等&#xff0c;如下图&#xff09;设置快捷键即可 Reference&#xff1a; https://www.cnblogs.com/Questio…

考前须知-11月软考机考

1、11月4-5日考试有几个时间点需注意&#xff1a; 考前40分钟&#xff0c;应试人员应到达准考证上所指定的考点&#xff0c;凭本人准考证和有效证件&#xff08;居民身份证、社会保障卡、港澳台居民身份证明、外籍人员护照、外国人永久居留证明&#xff09;原件进入进入本资格…

分析报告有样板了-奥威BI数据可视化报表模板

述职报告、月度数据分析报告、季度数据分析报告、区域数据分析报告……人在职场&#xff0c;数据分析报告少不了。那么&#xff0c;怎么才能在极短的时间内做出一张既好看又突出重点、分析逻辑在线的数据可视化分析报表&#xff1f;奥威BI软件的建议是采用BI数据可视化报表模板…

成本中心修改后推送其他SAP系统更新成本中心(ALE)

成本中心修改后推送给其他系统 KSH2成本中心组新增成本中心&#xff08;服务器A 400client&#xff09; KAVB 输入成本中心组、控制范围、目标系统 Y 查看&#xff08;服务器B 430client&#xff09;

数字化时代,谈谈数据资产这件事

在全球数字化转型的大趋势下&#xff0c;数据交易市场有望推动数据要素价值的开放共享和流通。据信通院测算&#xff0c;2021年全球47个重要经济体的数字经济增加值规模高达 38.1 万亿美元&#xff0c;我国2021年数字经济规模也已达到7.1万亿美元。数据之于数字经济的价值不言而…

科技云报道:打造生成式AI应用,什么才是关键?

科技云报道原创。 生成式AI作为当前人工智能的前沿领域&#xff0c;全球多家科技企业都在加大生成式AI的研发投入力度。 随着技术、产品及应用等方面不断推出重要成果&#xff0c;如今有更多的行业用户在思考该如何将生成式AI应用落地。 但开发生成式AI应用是一个充满挑战的…

关于嵌入式rtthread系统与单片机芯片

简介 我估计已经有很久没更新了&#xff0c;近一年都在某个国企里工作&#xff0c;我做的就是嵌入式工程师的岗位&#xff0c;最近才刚刚退出来&#xff0c;想来说说自己的工作使用的软件和系统。 本身进公司的时候&#xff0c;其实做的就是写单片机的板子的程序的工作&#x…

破局:如何从产业角度锻造企业不败竞争优势?

引言&#xff1a;究竟是坚守过去的辉煌,还是勇敢拥抱未来的变化?柯达的沉沦与富士胶片的崛起,揭示企业如何通过深刻理解自身的核心竞争力&#xff0c;利用产业战略的转变来实现持续发展。从产品竞争到产业升级,这不仅仅是一场商业竞赛的变革&#xff0c;更是一次企业战略思维的…

第24期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

Linux0.11内核源码解析-exec.c

主要实现对二进制可执行文件和shell文件的加载和执行&#xff0c;其中主要的函数是do_execve(),它是系统中断调用int 0x80的功能号__NR_execve()调用&#xff0c;是exec()函数的主要实现以下几点功能&#xff1a; 1.执行对参数和环境参数空间页面的初始化操作&#xff0c;初始…