4、QtCharts 做心电图


请添加图片描述

ui界面

在这里插入图片描述

在这里插入图片描述

核心代码

void Dialog::slot_timer()
{
    qreal xOffset=0.f;//x的偏移量,推进的距离
    qreal dIncrease=10;//增加量
    //数据
    for(int i=0;i<10;i++)
    {
        m_x+=dIncrease;
        xOffset+=dIncrease;
        m_splineSerise->append(m_x,qrand()%10);//根据实际情况删除多余数据
    }

    //删除多余数据
    if(m_splineSerise->count()>c_MaxSize)
    {
        m_splineSerise->removePoints(0,m_splineSerise->count()*0.5-c_MaxSize);//删除多余数据
    }


    //计算x周每个单位的宽度
    qreal xUnit =m_chart->plotArea().width()/(m_axisX->max()-m_axisX->min());
    qreal xScroll =xOffset*xUnit;

    m_chart->scroll(xScroll,0);//对x轴进行滚动

}

全部代码

#include "dialog.h"
#include "ui_dialog.h"

const quint32 c_MaxSize=1000;//数据个数

Dialog::Dialog(QWidget *parent)
    :QDialog(parent)
    ,ui(new Ui::Dialog)
    ,m_x(0.f)
    ,m_splineSerise(NULL)
{
    ui->setupUi(this);


    //构建曲线系列
    m_splineSerise=new QSplineSeries(this);

    //为折线图添加初始数据:第一个位置决定了心电图的曲线终点位置
    m_x=1000;
    m_splineSerise->append(m_x,1);


    //构建图标对象
    m_chart=new QChart();

    //注意:先添加到图表再创建坐标轴,否则无效

    //1.将折线系列添加到图表
    m_chart->addSeries(m_splineSerise);

    //构建坐标轴
    m_axisX = new QValueAxis();
    m_axisX->setRange(0,c_MaxSize);
    m_axisX->setTitleText(QStringLiteral("X"));//设置标题
    m_axisX->setLabelFormat("%g");//设置格式
    m_axisX->setTickCount(5);//设置刻度数
    m_axisY= new QValueAxis();
    m_axisY->setRange(-10,10);
    m_axisY->setTitleText(QStringLiteral("Y"));

    //将坐标轴绑定
    m_chart->setAxisX(m_axisX,m_splineSerise);
    m_chart->setAxisY(m_axisY,m_splineSerise);

     //隐藏图例
     m_chart->legend()->hide();


    //设置图标主题
    m_chart->setTheme(QtCharts::QChart::ChartThemeBlueCerulean);
    //设置标题
    m_chart->setTitle(QString("图表1"));
    //设置尺寸
    m_chart->setGeometry(0,0,500,300);


    //构建场景
    m_pScene =new QGraphicsScene(this);

    //为视图构建场景
    ui->graphicsView->setScene(m_pScene);

    //将图表添加到场景
    m_pScene->addItem(m_chart);

    //设置抗锯齿
    ui->graphicsView->setRenderHint(QPainter::Antialiasing,true);


    //构造定时器
    m_timer=new QTimer(this);
    m_timer->setInterval(100);//设置定时器间隔
    //绑定定时器
    connect(m_timer,&QTimer::timeout,this,&Dialog::slot_timer);
    m_timer->start();


}

Dialog::~Dialog()
{
    m_chart->removeAllSeries();
    delete ui;
}

qreal Dialog::getData(qreal x)
{
    return qSin(x*2*M_PI)*7;
}

void Dialog::slot_timer()
{
    qreal xOffset=0.f;//x的偏移量,推进的距离
    qreal dIncrease=10;//增加量
    //数据
    for(int i=0;i<10;i++)
    {
        m_x+=dIncrease;
        xOffset+=dIncrease;
        m_splineSerise->append(m_x,qrand()%10);//根据实际情况删除多余数据
    }

    //删除多余数据
    if(m_splineSerise->count()>c_MaxSize)
    {
        m_splineSerise->removePoints(0,m_splineSerise->count()*0.5-c_MaxSize);//删除多余数据
    }


    //计算x周每个单位的宽度
    qreal xUnit =m_chart->plotArea().width()/(m_axisX->max()-m_axisX->min());
    qreal xScroll =xOffset*xUnit;

    m_chart->scroll(xScroll,0);//对x轴进行滚动

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QtCharts是一个用于绘制图表的Qt模块,而QCustomPlot则是一个第三方库,可以用于绘制自定义的曲线图。如果你想使用QtCharts来实现心电图,可以按照以下步骤进行操作: 1. 在UI文件中添加一个Graphics View组件,用于显示图表。 2. 在代码中包含QtCharts头文件:`#include <QtCharts>` 3. 初始化心电图函数,可以参考下方的代码示例。 4. 在初始化函数中,设置心电图的网格线和其他属性。 5. 使用定时器来定时更新心电图数据,并在定时槽函数中绘制新的数据点。 6. 当心电图绘制到最右边时,使用QtCharts的数据集(series)来替换已有数据,实现循环绘制的效果。 以下是一个示例代码,演示了如何使用QtCharts来实现心电图功能: ```cpp #include <QtWidgets/QWidget> #include <QtCharts> class DynamicCurve : public QWidget { Q_OBJECT public: DynamicCurve(QWidget *parent = Q_NULLPTR); ~DynamicCurve(); private slots: void realtimeDataSlot(); private: QtCharts::QChartView *chartView; QtCharts::QLineSeries *series; QTimer *timer; }; DynamicCurve::DynamicCurve(QWidget *parent) : QWidget(parent) { // 创建图表和视图 QtCharts::QChart *chart = new QtCharts::QChart(); chartView = new QtCharts::QChartView(chart, this); chartView->setRenderHint(QPainter::Antialiasing); // 创建数据集 series = new QtCharts::QLineSeries(); chart->addSeries(series); // 设置图表的坐标轴 QtCharts::QValueAxis *axisX = new QtCharts::QValueAxis(); axisX->setRange(0, 100); // 设置X轴范围 axisX->setLabelFormat("%g"); chart->addAxis(axisX, Qt::AlignBottom); series->attachAxis(axisX); QtCharts::QValueAxis *axisY = new QtCharts::QValueAxis(); axisY->setRange(-1, 1); // 设置Y轴范围 axisY->setTitleText("Value"); chart->addAxis(axisY, Qt::AlignLeft); series->attachAxis(axisY); // 创建定时器 timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot())); timer->start(1000); // 每秒更新一次数据 // 创建布局,并将视图添加到布局中 QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(chartView); setLayout(layout); } DynamicCurve::~DynamicCurve() { delete chartView; delete timer; delete series; } void DynamicCurve::realtimeDataSlot() { static qreal x = 0; static qreal y = 0; x += 1; y = qSin(x * M_PI / 180.0); // 生成一个随机的Y值 // 添加新的数据点到数据集中 series->append(x, y); // 当心电图绘制到最右边时,替换已有数据 if (x > 100) { series->remove(0); // 调整X轴的范围 chartView->chart()->axisX()->setRange(x - 100, x); } } ``` 请注意,上述代码只是一个示例,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值