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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 中__name__ == ‘__main__‘使用说明

在学习C语言的时候&#xff0c;程序的运行是从main函数开始的&#xff0c;因此&#xff0c;功能代码一般写到main函数中&#xff0c;子程序如果想要调用&#xff0c;也需要在main函数中进行调用。 然而&#xff0c;Python语言中&#xff0c;程序从第一行就开始执行(定义函数除外…

我和云栖有个约会

开端&#xff0c;似曾相识的云栖 2023年阿里云云栖大会在云栖小镇举办&#xff0c;云栖小镇&#xff1f;在2020年的时候&#xff0c;曾经来过这里参加竞赛。时隔三年&#xff0c;身份变换&#xff0c;以开发者的身份&#xff0c;收到阿里云开发者社区的邀请&#xff0c;正好有…

探求flutter全栈开发

显示一种网络图片 import package:flutter/material.dart; main(){runApp(MaterialApp(theme: ThemeData.dark(),home:Home(),));}class Home extends StatelessWidget{overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar:AppBar(t…

基于联合表示学习、用户聚类和模型自适应的个性化联合推荐

[Personalized Federated Recommendation via Joint Representation Learning, User Clustering, and Model Adaptation] (https://dl.acm.org/doi/abs/10.1145/3511808.3557668) CIKM2022(CCF-B) 论文精读 文章主要创新点(消融实验分析的三个点)&#xff1a; 联合表示学习 …

电子电器架构 —— 车载网关初入门(二)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数5000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他…

【Android知识笔记】换肤专题

换肤其实也属于插件化专题的一个子话题,之所以单独拿出来,是因为它的处理方式比较特殊,相比插件化而言较简单一些。 系统内置的换肤功能支持 - Theme Android 系统中如果想修改应用的背景色,最简单的就是利用以下Theme相关的属性: 使用这些内置的属性可以实现一定程度上…

python爬虫,如何在代理的IP被封后立刻换下一个IP继续任务?

前言 在实际的爬虫应用中&#xff0c;爬虫程序经常会通过代理服务器来进行网络访问&#xff0c;以避免访问过于频繁而受到网站服务器的限制。但是&#xff0c;代理服务器的IP地址也可能被目标网站限制&#xff0c;导致无法正常访问。这时候&#xff0c;我们需要在代理IP被封后…

【Docker】如何查看之前docker run命令启动的参数

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

一文详解汽车电子LIN总线

0.摘要 汽车电子LIN总线不同于CAN总线。 LIN总线基本上是CAN总线的廉价补充&#xff0c;相比于CAN总线&#xff0c;它提供较低的可靠性和性能。同时LIN总线也是一个应用非常广泛的网络协议&#xff0c;并且越来越受欢迎。 再一次&#xff0c;我们准备了一个关于LIN总线的简要…

聚观早报 |华为nova 11 SE登场;vivo Y100正式发布

【聚观365】10月31日消息 华为nova 11 SE登场 vivo Y100正式发布 PTC Arena落地中国 2023财年苹果印度业务营收 iQOO 12外观设计揭晓 华为nova 11 SE登场 半年前&#xff0c;华为发布了nova 11系列手机&#xff0c;以“敢拍&#xff0c;敢出色”为宣传口号&#xff0c;继…

基于STC系列单片机实现外部中断0控制按键调节定时器0产生PWM(脉宽调制)的功能

#define uchar unsigned char//自定义无符号字符型为uchar #define uint unsigned int//自定义无符号整数型为uint sbit PwmOut P1^0;//位定义脉宽调制输出为单片机P1.0脚 uchar PwmTimeCount;//声明脉宽调制时间计数变量 uchar PwmDutyCycle;//声明脉宽调制占空比变量 void Ti…

uni-app中使用手机号一键登录的详细图文教程

1、首先需要在dcloud开发者控制台开通一键登录 https://dev.dcloud.net.cn/uniLogin 开通一键登录服务, 获取关键最关键的两个参数ApiKey和ApiSecret 真机调试无需添加应用&#xff0c;如需打包使用请添加。一键登录应用ID为离线打包时配置的appid 2、登录云服务空间&#xff0…

【Qt控件之QMessageBox】详解

Qt控件之QMessageBox 描述基于属性的API富文本和文本格式属性严重程度以及图标和Pixmap属性静态函数API 高级用法默认按钮和退出按钮示例使用场景 描述 QMessageBox类提供了一个模态对话框&#xff0c;用于通知用户或向用户提问并接收答案。 消息框显示一个主要文本以提醒用户…

Yuhan Blu-ray DVD Creator for Mac: 打造专属的高清视听盛宴

在如今的高清时代&#xff0c;谁能拒绝一款能够轻松将高清影片刻录成蓝光DVD的刻录机呢&#xff1f;而Yuhan Blu-ray DVD Creator for Mac正是这样一款令人惊艳的软件。 作为一款专为Mac用户打造的蓝光DVD刻录机&#xff0c;Yuhan Blu-ray DVD Creator for Mac支持将各种高清视…

PyQt5:构建目标检测算法GUI界面 (附python代码)

文章目录 1.界面2.代码3.Analyze 1.界面 目标检测算法一般就是检测个图片&#xff0c;然后显示图片结果。 最简单的情况&#xff0c;我们需要一个按钮读取图片&#xff0c;然后后有一个地方显示图片。 2.代码 import sys import numpy as np from PIL import Imagefrom PyQt…

Mybatis-Plus(企业实际开发应用)

一、Mybatis-Plus简介 MyBatis-Plus是MyBatis框架的一个增强工具&#xff0c;可以简化持久层代码开发MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 官网&a…

二叉树(9.7)

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 2.二叉树概念及结构 2.1概念 2.2 特殊的二叉树 2.4 二叉树的存储结构 3.二叉树顺序结构及实现 3.1 二叉树的顺序结构 3.2 堆的概念及结构 1.树概念及结构 1.1树的概念 前面我们学习的都是组成简…

SpringBoot面试题8:运行 Spring Boot 有哪几种方式?Spring Boot 需要独立的容器运行吗?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:运行 Spring Boot 有哪几种方式? 运行Spring Boot应用有多种方式,具体取决于你的需求和环境。以下是几种常见的运行Spring Boot应用的方式: 使…

springboot+vue基于Hadoop短视频流量数据分析与可视化系统的设计与实现【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

【计算机网络】数据链路层——以太网

文章目录 前言什么是以太网以太网帧格式6位目的地址和源地址2位类型数据长度CRC 校验和 数据在数据链路层是如何转发的 前言 前面我们学习了关于应用层——自定义协议、传输层——UDP、TCP协议、网络层——IP协议&#xff0c;今天我将为大家分享关于数据链路层——以太网方面的…