y 轴的 QtCharts 自动范围

QtCharts auto range for y-axis

我想使用动态绘图自动更改 y 轴。我更改了示例中的动态绘图示例并附加了很多要点。添加新点后,绘图应调整其 y 轴以说明新的最大值。情节是否可以自动执行此操作?

我们可以使用系列的信号pointAdded来更新范围,为此我们将创建2个变量,分别存储最大值和最小值:

connect(m_series, &QSplineSeries::pointAdded, [=](int index){
    qreal y = m_series->at(index).y();

    if(y< yMin || y > yMax){
        if(y < yMin)
            yMin = y;
        if(y> yMax)
            yMax = y;
        axisY()->setRange(yMin-20, yMax+20);
    }

});

完整代码:

chart.h

#ifndef CHART_H
#define CHART_H

#include <QtCharts/QChart>
#include <QTimer>

QT_CHARTS_BEGIN_NAMESPACE
class QSplineSeries;
class QValueAxis;
QT_CHARTS_END_NAMESPACE

QT_CHARTS_USE_NAMESPACE

//![1]
class Chart: public QChart
{
    Q_OBJECT
public:
    Chart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
    virtual ~Chart();

public slots:
    void handleTimeout();

private:
    QTimer m_timer;
    QSplineSeries *m_series;
    QStringList m_titles;
    QValueAxis *m_axis;
    qreal m_step;
    qreal m_x;
    qreal m_y;
    //new variables
    qreal yMin;
    qreal yMax;
};
//![1]

chart.cpp

#include "chart.h"
#include <QtCharts/QAbstractAxis>
#include <QtCharts/QSplineSeries>
#include <QtCharts/QValueAxis>
#include <QTime>
#include <QDebug>

Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags):
    QChart(QChart::ChartTypeCartesian, parent, wFlags),
    m_series(0),
    m_axis(new QValueAxis),
    m_step(0),
    m_x(5),
    m_y(1)
{
    qsrand((uint) QTime::currentTime().msec());

    connect(&m_timer, &QTimer::timeout, this, &Chart::handleTimeout);
    m_timer.setInterval(1000);

    m_series = new QSplineSeries(this);

    QPen green(Qt::red);
    green.setWidth(3);
    m_series->setPen(green);
    m_series->append(m_x, m_y);

    addSeries(m_series);
    createDefaultAxes();
    setAxisX(m_axis, m_series);
    m_axis->setTickCount(5);

    yMax = 10;
    yMin = -5;

    axisX()->setRange(0, 10);
    axisY()->setRange(yMin, yMax);

    connect(m_series, &QSplineSeries::pointAdded, [=](int index){
        qreal y = m_series->at(index).y();

        if(y< yMin || y > yMax){
            if(y < yMin)
                yMin = y;
            if(y> yMax)
                yMax = y;
            axisY()->setRange(yMin-20, yMax+20);
        }

    });

    m_timer.start();
}

Chart::~Chart()
{

}

void Chart::handleTimeout()
{
    qreal x = plotArea().width() / m_axis->tickCount();
    qreal y = (m_axis->max() - m_axis->min()) / m_axis->tickCount();
    m_x += y;
    //m_y = qrand() % 5 - 2.5;
    m_y = 50*(qrand() % 5 - 2.5);
    m_series->append(m_x, m_y);
    scroll(x, 0);
    if (m_x == 100)
        m_timer.stop();
}