QLineSeries绘制动态曲线

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a844651990/article/details/82706466

  本文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()
{
}

猜你喜欢

转载自blog.csdn.net/a844651990/article/details/82706466