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

2023-11-01 03:28

本文主要是介绍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

这篇关于041-第三代软件开发-QCustcomPlot波形标注的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/320137

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

【软件工程】软件开发模型

三、瀑布模型  四、几种软件开发模型的主要特点 题目 判断题 选择题 小结

vue3 为组件的 emits 标注类型,defineEmits基于类型的定义的简单理解

1)在 <script setup> 中,emit 函数的类型标注也可以通过运行时声明或是类型声明进行。 2)基于类型的: const emit = defineEmits<{ (e: 'change', id: number): void (e: 'update', value: string): void }>() 说明:e: 指定了方法名,id:数字型的参数,这个就是限定了方法名及

水面垃圾检测数据集 3000张 水面垃圾 带标注 voc yolo

数据集概述 该数据集包含3000张图像,专注于水面垃圾的检测。数据集已经按照VOC(Visual Object Classes)和YOLO(You Only Look Once)两种格式进行了标注,适用于训练深度学习模型,特别是物体检测模型,用于识别水面上的各种垃圾。 数据集特点 多样性:包含3000张图像,涵盖了多种类型的水面垃圾,确保模型能够识别各种类型的垃圾。双标注格式:提供VO

军事目标无人机视角检测数据集 3500张 坦克 带标注voc

数据集概述 该数据集包含3500张无人机拍摄的图像,主要用于坦克目标的检测。数据集已经按照VOC(Visual Object Classes)标准进行了标注,适用于训练深度学习模型,特别是物体检测模型。 数据集特点 目标明确:专注于坦克这一特定军事目标的检测。多样视角:图像采集自无人机的不同飞行高度和角度,涵盖了各种环境下的坦克图像。高质量标注:每个坦克实例都被精确标注,包括位置信息和类别

geemap学习笔记041:Landsat Collection2系列数据去云算法总结--更新

前言 在上一篇文章中,提到了Landsat Collection2的去云算法,在不断的使用过程中,发现GEE官方也是给出过Landsat的去云算法,在这进行补充,进行对比后发现,两者去云的效果相差不大。 Landsat 8 Collection2官方去云算法 只需要将原先的rmL8CloudNew函数进行替换即可。 def rmL8CloudNew_official(image):# Bi

集成电路学习:什么是SDK软件开发工具包

SDK:软件开发工具包         SDK,即Software Development Kit(软件开发工具包),是一套由软件提供商或其他组织提供的开发工具集合。这些工具旨在帮助开发者更快速、更便捷地创建、测试和部署软件应用程序。以下是对SDK的详细解释: 一、SDK的定义与组成         定义:SDK是一套包含编程工具、代码示例、技术说明文档、调试和测试工具等内容的软件包,有

从知识视角理解软件开发

软件构造中的核心知识:业务知识与架构知识 在软件构造过程中,最关键的两类知识是业务知识和架构知识。业务知识回答“什么是正确的软件”,而架构知识解决“如何正确地构造软件”。从这两个方面深入理解软件构造,可以帮助我们在设计和开发过程中做出更明智的决策。 1. 业务知识:定义正确的软件 业务知识是关于如何解决现实问题的知识,包括业务的目标、规则、限制、和已有的解决方案。它定义了“正确的软件”是什么