3、QtCharts 动态曲线图

文章目录

  • 效果
  • 声明变量
  • 构建静态图表
  • 创建计时器连接信号与槽
  • 槽函数核心代码

效果

3、QtCharts 动态曲线图_第1张图片

声明变量

3、QtCharts 动态曲线图_第2张图片

构建静态图表

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

    //为折线添加数据
    qreal x=0.f;
    for (size_t i=0;i<c_MaxSize;i++)
    {
        x=qreal(i+1)/c_MaxSize;
        m_splineSerise->append(i,getData(x));
    }

    //构建图标对象
    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();

槽函数核心代码

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

void Dialog::slot_timer()
{
    //首先用一个静态对象存储启动时间
    static QTime tmBegin=QTime::currentTime();
    //将tmBegin流失的时间存到变量
    quint64 tmEllapsed=tmBegin.elapsed();
    quint64 nSkip=tmEllapsed-m_tmLast;//计时器两次定时中断(超时)之间的时间差

    QVector<QPointF> ptsOld = m_splineSerise->pointsVector();
    QVector<QPointF> ptsNew;//跟新后的数据


    //将后面的数据向前平移
    qint64 i=0;
    for(i=0;i<(ptsOld.count()-nSkip);i++)
    {
        //将后面的数据平移到开头
        ptsNew.append(QPointF(i,ptsOld[nSkip+i].y()));
    }



    qreal x=0.f;
    //补充新数据
    for(i=ptsOld.count()-nSkip;i<ptsOld.count();i++)
    {
        x=qreal(m_tmLast+i+1)/c_MaxSize;
        //将后面的数据平移到开头
        ptsNew.append(QPointF(i,getData(x)));
    }

    //更新系列
    m_splineSerise->replace(ptsNew);
    //更新上次进入定时器的时间
    m_tmLast=tmEllapsed;
}

3、QtCharts 动态曲线图_第3张图片

你可能感兴趣的:(qt)