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

这篇具有很好参考价值的文章主要介绍了041-第三代软件开发-QCustcomPlot波形标注。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

041-第三代软件开发-QCustcomPlot波形标注,# 一个真实的QML&C++项目,qt,qml,QCustcomPlot

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


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

项目介绍

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

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

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

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

重要说明☝

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

QCustcomPlot波形标注

效果

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

041-第三代软件开发-QCustcomPlot波形标注,# 一个真实的QML&C++项目,qt,qml,QCustcomPlot

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

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

041-第三代软件开发-QCustcomPlot波形标注,# 一个真实的QML&C++项目,qt,qml,QCustcomPlot

初始化

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

/**
 * @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 的经典之一,信号槽,还记得上篇中组后,如果我们抓到波形就会触发一个信号,那个信号连接的槽就是这个函数,这个函数的作用就是根据上篇中的波形坐标,把对应的线,箭头,数据绘制在上面文章来源地址https://www.toymoban.com/news/detail-737530.html

/**
 * @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);

}

041-第三代软件开发-QCustcomPlot波形标注,# 一个真实的QML&amp;C++项目,qt,qml,QCustcomPlot

到了这里,关于041-第三代软件开发-QCustcomPlot波形标注的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 测试软件开发---软件缺陷章

    软件缺陷 软件出现缺陷一般是因为开发的流程规划不准确,需求不明确,或需求变更/在开发者开发的时候无法清晰的理解需求出现不同程度的偏差/客户方频繁的更改、更新需求也会影响到软件的质量 软件结构复杂、编码误差/错误、项目期限过短、项目中插入新的技术 处理

    2024年02月02日
    浏览(56)
  • 易语言软件定制软件开发脚本开发协议软件电脑网站APP应用视频制作工程制作

    随着信息技术的不断发展,易语言软件定制开发已成为许多公司的一项重要业务。本文将探讨如何利用易语言承接软件定制软件开发脚本开发协议软件电脑网站APP应用视频制作工程制作。 一、易语言概述 易语言是一种简单易学的编程语言,它采用中文编程,让不会英文的初

    2024年02月08日
    浏览(57)
  • 用python开发软件的步骤,如何用python做软件开发

    大家好,小编来为大家解答以下问题,如何用python做软件开发,用python开发软件的步骤,今天让我们一起来看看吧!   参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤。 了解遵循输入、处理、输出(IPO)模式的程序,并能够以简单

    2024年02月06日
    浏览(50)
  • 数据驱动开发模式将软件开发过程改造成一个公式化的迭代模式,可以提升软件开发效率,缩短开发周期,降低开发成本。

    作者:禅与计算机程序设计艺术 随着云计算、大数据等新兴技术的应用,软件开发领域迎来了蓬勃发展的时期。各种编程语言、框架、工具不断涌现,协同工作的强烈需求已经成为当今社会的一个主要挑战。这就需要一种新的开发方式来适应这种复杂多变的环境。传统的瀑布

    2024年02月06日
    浏览(46)
  • 中文编程开发语言工具开发的实际软件案例:称重管理系统软件

    中文编程开发语言工具开发的实际软件案例:称重管理系统软件 中文编程开发语言工具开发的实际软件案例:称重管理系统软件,软件可以安装在电脑上,也可以安装在收银机上,支持触摸和鼠标点,想学编程可以关注系统化的编程课程。 中文编程系统化教程,不需英语基

    2024年02月07日
    浏览(55)
  • 易语言软件定制开发爬虫模拟协议填写自动化办公软件开发多人团队

    在当今快速发展的信息化时代,企业对于高效、自动化的软件需求日益增长。而易语言软件定制开发爬虫模拟协议填写自动化办公软件开发多人团队,正是为了满足这一需求而诞生的。 一、团队背景 技术顾问、维:Daxiami6789 易语言软件定制开发爬虫模拟协议填写自动化办公

    2024年02月05日
    浏览(51)
  • 软件架构设计(八) 基于架构的软件开发方法

    ABSD虽然在日常生活中并不常见,但是在考试中却是极为常见的,因此仍然是我们的重点学习知识点。 特点 基于架构的软件设计(Architecture-Based Software Design,ABSD),这个开发方法是 架构驱动 。 即 强调由业务、质量和功能需求的组合驱动架构设计 。就是会考虑到业务的情况

    2024年02月09日
    浏览(33)
  • 开源软件:推动软件开发行业繁荣的关键力量

    在数字化时代,软件开发行业的发展日新月异,开源软件作为一种推动力,正逐渐改变着软件开发的生态。本文将探讨开源软件如何成为推动软件开发行业繁荣的力量,并分析其对我国软件产业的发展意义。 开源软件,是指源代码公开、可以自由使用和修改的软件。这种软件

    2024年02月22日
    浏览(56)
  • 大数据开发和软件开发哪个前景好?

    大数据开发和软件开发哪个前景好?大数据开发学习有难度,零基础入门要先学习Java语言打基础,然后进入大数据技术体系的学习,学习Hadoop、Spark、Storm等知识。软件开发工程师根据不同的学科从事的岗位也千差万别。 先说说大数据开发岗位和就业的前景,大数据开发岗位

    2024年02月06日
    浏览(33)
  • 开发复杂软件的系统方法(二)之软件建模

    这几周与公司的软件开发专家(职称)讨论产品的软件新架构与方案,主要涉及两点 是否复用现有的核心机制 基于领域建模设计 关于第一点,双方达成一致。 关于第二点,领域可以理解为业务,业务专家(产品经理,需求工程师,临床工程师等)与研发人员一起,通过头脑风暴

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包