Solved QtCharts auto range for y-axis
-
Hi everyone,
I would like to change automatically y-axis for the dynamic plot. I changed the dynamic plot example in examples and have appended lots of points and after a new point was appended, it should set its y-axis for maximum value. Is it possible this automatically? -
@Gokhan Never done that but I imagine that's what models are for.
-
This post is deleted! -
I also had written this topic in stackoverflow,eyllanesc answered and gave an example about it, perhaps it helps someone.
Link : Solutionchart.h
#ifndef CHART_H #define CHART_H #include <QtCharts/QChart> #include <QtCore/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 <QtCore/QTime> #include <QtCore/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()); QObject::connect(&m_timer, SIGNAL(timeout()), this, SLOT(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(); }
-
I have tried to add time axis for the x-axis, but I can't. It's time always is the same so it's not changing. Why?
m_series->append(QDateTime::currentDateTime().toMSecsSinceEpoch(), m_y);
-
The post is old, but I use that :
m_dateTimeAxisX->setMax(QDateTime::currentDateTime()); m_dateTimeAxisX->setMin(QDateTime::currentDateTime().addSecs(-m_scaleInSec));