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.rhkb.cn/news/176391.html

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

相关文章

精密数据工匠:探索 Netty ChannelHandler 的奥秘

通过上篇文章&#xff08;Netty入门 — Channel&#xff0c;把握 Netty 通信的命门&#xff09;&#xff0c;我们知道 Channel 是传输数据的通道&#xff0c;但是有了数据&#xff0c;也有数据通道&#xff0c;没有数据加工也是没有意义的&#xff0c;所以今天学习 Netty 的第四…

Windows2008系统怎么隐藏或打开文件后缀

打开服务器的控制面板-选择小图标-文件夹选项 在文件夹选项那边点击查看-隐藏一直文件类型的扩展名 选择勾选&#xff08;隐藏一直文件类型的扩展名&#xff09;-下图示文件后缀不显示 选择不勾选&#xff08;隐藏一直文件类型的扩展名&#xff09;-下图示文件后缀显示

自定义元素宽高比例(aspect-ratio)与@supports兼容支持和图片裁剪(object-fit)的用法

使用grid布局可以轻松实现响应式布局&#xff0c;子元素只需要设置最小宽度即可&#xff0c;如果对子元素没有设置高度&#xff0c;那么高度取决于内容的最大值&#xff0c;这样显然是不稳定的&#xff0c;如下图所示&#xff1a; 出现这种问题就造成布局混乱了&#xff0c;可…

5000张照片怎么快速发给别人?分享三个简单的方法!

有的时候我们不得不一次性发送很多图片&#xff0c;一张一张发实在让人头疼&#xff0c;这个时候就需要借助一些图片压缩工具打包成文件压缩包发送。下面介绍了三种好用的方法&#xff0c;一起来看看吧&#xff5e; 方法一&#xff1a;使用微信助手 可以使用微信助手&#xff…

【C++】多态 ⑨ ( vptr 指针初始化问题 | 构造函数 中 调用 虚函数 - 没有多态效果 )

文章目录 一、vptr 指针初始化问题1、vptr 指针与虚函数表2、vptr 指针初始化时机3、构造函数 中 调用 虚函数 - 没有多态效果4、代码示例 构造函数 的 作用就是 创建对象 , 构造函数 最后 一行代码 执行完成 , 才意味着 对象构建完成 , 对象构建完成后 , 才会将 vptr 指针 指向…

对xss-labs靶场的一次XSS攻击

1、首先我们进入靶场&#xff0c;提示我们开始测试 2、我使用AWVS工具进行了先行扫描&#xff0c;发现爆出XSS漏洞 3、然后对症下药 在输入框中输入&#xff1a; <script>alert(document.cookie)</script> 4、进入下一关 5、我们直接执行<script>…

一次cs上线服务器的练习

环境&#xff1a;利用vm搭建的环境 仅主机为65段 测试是否能与win10ping通 配置转发 配置好iis Kali访问测试 现在就用burp抓取winser的包 开启代理 使用默认的8080抓取成功 上线

微服务之负载均衡使用场景

在如见常见微服务系统中&#xff0c;负载均衡组件是一种将流量分配到多个服务的技术&#xff0c;目的是提高系统的性能和可用性。负载均衡有两种常见的模式&#xff1a;服务端模式和客户端模式。服务端模式使用独立的应用程序&#xff08;如 Nginx&#xff09;来转发请求&#…

20.2 OpenSSL 非对称RSA加解密算法

RSA算法是一种非对称加密算法&#xff0c;由三位数学家Rivest、Shamir和Adleman共同发明&#xff0c;以他们三人的名字首字母命名。RSA算法的安全性基于大数分解问题&#xff0c;即对于一个非常大的合数&#xff0c;将其分解为两个质数的乘积是非常困难的。 RSA算法是一种常用…

内网渗透-域信息收集

域环境 虚拟机应用&#xff1a;vmware17 域控主机&#xff1a;win2008 2r 域成员主机&#xff1a;win2008 2r win7 一.域用户和本地用户区别 使用本地用户安装程序时&#xff0c;可以直接安装 使用域用户安装程序时&#xff0c;需要输入域控管理员的账号密码才能安装。总结…

Leetcode.树形DP

目录 543.二叉树的直径 124.二叉树中的最大路径和 2246.相邻字符不同的最长路径 543.二叉树的直径 用递归来写 考虑 树形DP 维护以当前节点为根节点的最大值&#xff0c;同时返回给父节点经过当前节点的最大链的长度&#xff0c;这有个trick 当遍历到空节点的时候返回-1 递归…

Web3公链之Cosmos生态的项目Celestia

文章目录 Web3公链之Cosmos生态的项目&#xff1a;模块化区块链Celestia什么是CelestiaCelestia网络架构数据可用性问题有哪些可用的解决方案&#xff1f; 发展历史运行节点参考 Web3公链之Cosmos生态的项目&#xff1a;模块化区块链Celestia 什么是Celestia 官网&#xff1a…

Go学习第十七章——Gin中间件与路由

Go web框架——Gin中间件与路由 1 单独注册中间件1.1 入门案例1.2 多个中间件1.3 中间件拦截响应1.4 中间件放行 2 全局注册中间件3 自定义参数传递4 路由分组4.1 入门案例4.2 路由分组注册中间件4.3 综合使用 5 使用内置的中间件6 中间件案例权限验证耗时统计 1 单独注册中间件…

驱动day10作业

基于platform驱动模型完成LED驱动的编写 驱动程序 #include <linux/init.h> #include <linux/module.h> #include<linux/platform_device.h> #include<linux/mod_devicetable.h> #include<linux/of.h> #include<linux/of_gpio.h> #inclu…

【CSS】包含块

CSS规范中的包含块 包含块的内容&#xff1a; 元素的尺寸和位置&#xff0c;会受它的包含块所影响。 对于一些属性&#xff0c;例如 width, height, padding, margin&#xff0c;绝对定位元素的偏移值&#xff08;比如 position 被设置为 absolute 或 fixed&#xff09;&…

【原创】java+swing+mysql无偿献血管理系统设计与实现

摘要&#xff1a; 无偿献血管理系统是为了实现无偿献血规范化、有序化、高效化的管理而设计的。本文主要介绍使用java语言开发一个基于C/S架构的无偿献血管理系统&#xff0c;提高无偿献血管理的工作效率。 功能分析&#xff1a; 系统主要提供给管理员、无偿献血人员&#x…

【Mybatis-Plus】代码生成器

目录 安装插件 数据库建表 Other Config Database Code Generator 根据创建好的数据库表&#xff0c;来直接生成代码 安装插件 数据库建表 Other 点开之后有两个功能 1.数据库配置 2.代码生成 Config Database 首先点开这个配置数据库 Code Generator 配置完数据库…

数据结构第一课-----------数据结构的介绍

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Web自动化测试进阶 —— Selenium模拟鼠标操作

鼠标操作事件 在实际的web产品测试中&#xff0c;对于鼠标的操作&#xff0c;不单单只有click()&#xff0c;有时候还要用到右击、双击、拖动等操作&#xff0c;这些操作包含在ActionChains类中。 ActionChains类中鼠标操作常用方法&#xff1a; 首先导入ActionChains类&…

Redis持久化(RDB、AOF)

一、RDB RDB&#xff1a;Redis数据备份文件&#xff0c;也叫Redis数据快照&#xff0c;简单来说就是把内存数据保存的磁盘上&#xff0c;当Redis故障重启后&#xff0c;从磁盘中读取快照并恢复数据到Redis中。 RDB有两种启动命令&#xff1a; save&#xff1a;由Redis主进程…