QLineSeries绘制动态曲线

  本文QLineSeries绘制动态曲线涉及到两种,一种是曲线动态坐标固定,一种是曲线和坐标都是动态的。
#一、曲线动态坐标固定
  效果图:
这里写图片描述
这种比较简单,直接计算坐标位置,x轴超出范围之后重新计算保存的点地数据,替换掉超出范围之前的所有的点的数据。
#二、曲线和坐标都是动态的
  效果图:
这里写图片描述
需要注意的是在QChart的addSeries之后,QLineSeries 的append之后如果数据超过坐标范围,需要手动设置xy轴范围才能正确显示。

源码:
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    QList<QPointF> m_data;
    int m_count;
    qreal m_maxY;
    qreal m_minY;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QPushButton>
#include <QLayout>
#include <QtCharts>
#include <QTimer>
#include <math.h>
#include <QDebug>

QT_CHARTS_USE_NAMESPACE

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    m_count(0),
    m_maxY(0.1),
    m_minY(-0.1)
{
    QTimer *pTimer1 = new QTimer(this);
    QTimer *pTimer2 = new QTimer(this);

    QLineSeries *pSeries = new QLineSeries();

    QChart *chart = new QChart();
    chart->legend()->hide();
    chart->addSeries(pSeries);
    chart->createDefaultAxes();
    chart->setTitle("动态曲线图");
    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);

    QPushButton *pBtn1 = new QPushButton(("动态曲线,坐标轴固定"), this);
    QPushButton *pBtn2 = new QPushButton(("动态曲线,动态坐标轴"), this);

    QWidget *pCentralWidget = new QWidget(this);
    QHBoxLayout *pHLayout = new QHBoxLayout();
    pHLayout->addWidget(pBtn1);
    pHLayout->addWidget(pBtn2);
    pHLayout->addStretch();
    QVBoxLayout *pVLayout = new QVBoxLayout(pCentralWidget);
    pVLayout->addLayout(pHLayout);
    pVLayout->addWidget(chartView);

    setCentralWidget(pCentralWidget);
    resize(800, 600);

    connect(pBtn1, &QPushButton::clicked, [=]() {
        pSeries->clear();
        m_data.clear();
        m_count = 0;
        chart->axisX()->setRange(0, 720);
        chart->axisY()->setRange(-1, 1);
        pTimer2->stop();
        pTimer1->start(5);
        for (int i = 0; i < 720; i++) {
            qreal x = i;
            m_data.append(QPointF(i, qSin(2.0 * 3.141592 * x / 360.0)));
        }
        pSeries->append(m_data);
    });

    connect(pBtn2, &QPushButton::clicked, [=]() {
        pSeries->clear();
        pTimer1->stop();
        m_count = 0;
        m_maxY = 0;
        m_minY = 0;
        chart->axisX()->setRange(0, 1);
        chart->axisY()->setRange(0, 1);
        pTimer2->start(5);
    });

    connect(pTimer1, &QTimer::timeout, [=]() {
        qreal x = m_count;
        for (int i=0; i<m_data.size(); ++i)
            m_data[i].setX(m_data.at(i).x() - 1);

        m_data.append(QPointF(720, qSin(2.0 * 3.141592 * x / 360.0)));
        m_data.removeFirst();
        pSeries->replace(m_data);

        ++ m_count;
        if (m_count > 360)
            m_count = 0;
    });
    connect(pTimer2, &QTimer::timeout, [=]() {
        qreal x = m_count;
        QPointF point = QPointF(m_count, qSin(2.0 * 3.141592 * x / 360.0));
        m_maxY = (m_maxY<point.y()) ? point.y() : m_maxY;
        m_minY = (m_minY>point.y()) ? point.y() : m_minY;
        chart->axisX()->setRange(0, point.x());
        chart->axisY()->setRange(m_minY, m_maxY);
        pSeries->append(point);
        ++ m_count;
    });
}

MainWindow::~MainWindow()
{
}

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值