答案 0 :(得分:4)
我们可以使用系列的信号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();
}