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 : Solution

    alt text

    chart.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);
    

    alt text



  • The post is old, but I use that :

        m_dateTimeAxisX->setMax(QDateTime::currentDateTime());
        m_dateTimeAxisX->setMin(QDateTime::currentDateTime().addSecs(-m_scaleInSec));

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.