缄默221 2023-03-11 16:51 采纳率: 100%
浏览 72
已结题

qwt实时波形,标记特征点。

项目是利用qwt展示实时波形。目前需要添加一个功能:在特殊的点,做一个方块或者其他特殊的标记。例如血氧波形,在每一个周期的三个部分做标记。下位机在需要做标记的点位发送1,无需标记的点位发送0;如下图所示:

img

注:本人刚入门不久,可能需朋友们敲好的源码才能看得懂。

  • 写回答

6条回答 默认 最新

  • dahe0825 2023-03-11 17:08
    关注

    参考GPT和自己的思路,以下是一个的 C++ 代码示例,用于在 Qwt 实时波形上添加标记。示例代码基于 Qt5 和 Qwt6,但是可以根据您的版本进行适当的调整。

    假设您的波形数据是通过一个 QwtPlotCurve 对象进行绘制的。在下面的代码中,我们将为该曲线添加一个名为 markers 的新数据项,用于在需要添加标记的点位上显示标记。

    #include <QTimer>
    #include <QVector>
    #include <QPointF>
    #include <QwtPlot>
    #include <QwtPlotCurve>
    
    class MyPlot : public QwtPlot
    {
        Q_OBJECT
    
    public:
        MyPlot(QWidget *parent = nullptr)
            : QwtPlot(parent)
            , m_curve(nullptr)
        {
            // 创建曲线对象
            m_curve = new QwtPlotCurve("My Curve");
            m_curve->attach(this);
    
            // 创建数据数组
            m_data.resize(1000);
            for (int i = 0; i < m_data.size(); i++) {
                m_data[i].setX(i);
                m_data[i].setY(0);
            }
    
            // 添加标记数据项
            m_markers.resize(m_data.size());
            for (int i = 0; i < m_markers.size(); i++) {
                m_markers[i].setX(i);
                m_markers[i].setY(0);
            }
            m_curve->setData(m_data + m_markers);
    
            // 启动定时器
            QTimer *timer = new QTimer(this);
            connect(timer, &QTimer::timeout, this, &MyPlot::updateData);
            timer->start(50);
        }
    
    public slots:
        void updateData()
        {
            // 从下位机获取数据
            bool is_marked = getMarkFlag();
    
            // 更新数据数组
            for (int i = 0; i < m_data.size(); i++) {
                m_data[i].setY(qrand() % 100);
            }
    
            // 更新标记数据项
            QPointF marker_value(0, 0);
            if (is_marked) {
                marker_value.setY(100);
            }
            for (int i = 0; i < m_markers.size(); i += 3) {
                m_markers[i] = marker_value;
            }
    
            // 更新曲线数据
            m_curve->setData(m_data + m_markers);
            replot();
        }
    
    private:
        QwtPlotCurve *m_curve;
        QVector<QPointF> m_data;
        QVector<QPointF> m_markers;
    
        bool getMarkFlag()
        {
            // TODO: 从下位机获取标记数据
            return (qrand() % 10) < 2;
        }
    };
    

    在上面的代码中,我们为波形数据数组 m_data 和标记数据数组 m_markers 分别创建了一个长度为 1000 的 QPointF 数组。然后,我们将标记数据数组添加到曲线的数据项中,并在定时器的回调函数中更新数据。每当需要在某个点位添加标记时,我们将该点位在标记数据数组中对应的 QPointF 对象的 Y 坐标设置为 100。

    这里假设血氧波形的周期长度为 3,因此每隔 3 个数据点就会添加一个标记。
    回答不易,还请采纳!!!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 3月11日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改