项目是利用qwt展示实时波形。目前需要添加一个功能:在特殊的点,做一个方块或者其他特殊的标记。例如血氧波形,在每一个周期的三个部分做标记。下位机在需要做标记的点位发送1,无需标记的点位发送0;如下图所示:
注:本人刚入门不久,可能需朋友们敲好的源码才能看得懂。
项目是利用qwt展示实时波形。目前需要添加一个功能:在特殊的点,做一个方块或者其他特殊的标记。例如血氧波形,在每一个周期的三个部分做标记。下位机在需要做标记的点位发送1,无需标记的点位发送0;如下图所示:
注:本人刚入门不久,可能需朋友们敲好的源码才能看得懂。
参考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 个数据点就会添加一个标记。
回答不易,还请采纳!!!