Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QtCharts setRange issue



  • Hello!

    I want to display some data using QtCharts. I have tried the DynamicSpline example, it works well but when I set my data then nothing is displayed. I think the problem is with the setRange method.

    Code:

    chart.h:

    #ifndef CHART_H
    #define CHART_H
    
    #include <QChart>
    #include <QTimer>
    #include <QAbstractAxis>
    #include <QSplineSeries>
    #include <QValueAxis>
    #include <QDebug>
    
    QT_CHARTS_BEGIN_NAMESPACE
    class QSplineSeries;
    class QValueAxis;
    QT_CHARTS_END_NAMESPACE
    
    QT_CHARTS_USE_NAMESPACE
    
    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_axisX;
        QValueAxis *m_axisY;
        qreal m_step;
        qreal m_x;
        qreal m_y;
        QList<double> testList;
    };
    
    #endif /* CHART_H */
    

    chart.cpp:

    #include "chart.h"
    
    Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags):
        QChart(QChart::ChartTypeCartesian, parent, wFlags),
        m_series(0),
        m_step(0),
        m_x(1),
        m_y(1)
    {
        m_axisX = new QValueAxis(this);
        m_axisX->setLabelsVisible(false);
        m_axisY = new QValueAxis(this);
        m_axisY->setLabelsVisible(false);
        connect(&m_timer, &QTimer::timeout, this, &Chart::handleTimeout);
        m_timer.setInterval(1000);
        m_series = new QSplineSeries(this);
        QPen green(Qt::green);
        green.setWidth(3);
        m_series->setPen(green);
        m_series->append(m_x, m_y);
        legend()->hide();
        addSeries(m_series);
        setAxisX(m_axisX, m_series);
        setAxisY(m_axisY, m_series);
        m_axisX->setTickCount(5);
        testList << 93.8436 << 777.797 << 2507.78 << 5999.44 << 6806.54 << 7481.16
                     << 8008.5 << 8093.8 << 8161.83 << 8216.99
                     << 8280.46 << 8328.4 << 8394.55 << 8469.84
                     << 8500.65 << 8558.16 << 8660.9 << 8638.87
                     << 8726.47 << 8715.25 << 8804.48 << 8793.86
                     << 8839.42 << 8875.75 << 8938.24 << 8977.09
                     << 9020.27 << 9046.7 << 9092.04 << 9121.58
                     << 9155.36 << 9199.46;
    
        axisX()->setRange(0, 100);
        axisY()->setRange(-1, 100);
        m_timer.start();
    }
    
    void Chart::handleTimeout()
    {
        qreal x = plotArea().width() / m_axisX->tickCount();
        qreal y = (m_axisX->max() - m_axisX->min()) / m_axisX->tickCount();
        m_x += y;
    
        if (!testList.isEmpty()) {
            m_y = testList.first();
            testList.takeFirst();
        }
    
        qDebug() << "m_x: " << m_x << " " << "m_y: " << m_y;
        m_series->append(m_x, m_y);
        scroll(x, 0);
    }
    
    Chart::~Chart()
    {
    
    }
    

    main.cpp:

    #include "chart.h"
    #include <QChartView>
    #include <QApplication>
    #include <QWidget>
    #include <QHBoxLayout>
    
    QT_CHARTS_USE_NAMESPACE
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWidget window;
        Chart *chart = new Chart;
        //chart->setTitle("Dynamic spline chart");
        chart->setAnimationOptions(QChart::AllAnimations);
        QChartView chartView(chart);
        chartView.setRenderHint(QPainter::Antialiasing);
        chartView.resize(window.size());
        QHBoxLayout *layout = new QHBoxLayout();
        layout->addWidget(&chartView);
        window.setLayout(layout);
        window.setMinimumSize(810, 400);
        window.show();
        return a.exec();
    }
    

    Any ideas how to fix it? Thanks.



  • Hello!

    I have fixed the issue by using QtNetworkMonitor example from GitHub. The issue is resolved.



  • I have fixed the issue. Now it works well, but I need to set the axis rect background color.

    Screenshot:

    1456789.png

    Any ideas how to set the axis background color? Thanks.



  • Hello!

    I tried to use the QAreaSeries to set the axis rect background. But it displays: "Can not find series on the chart.",
    "Can not find series on the chart." issues and draw incorrectly.

    Screenshot:

    alt text

    Code:
    chart.h

    #ifndef CHART_H
    #define CHART_H
    
    #include <QChart>
    #include <QTimer>
    #include <QAbstractAxis>
    #include <QLineSeries>
    #include <QValueAxis>
    #include <QAreaSeries>
    #include <QDebug>
    
    QT_CHARTS_BEGIN_NAMESPACE
    class QLineSeries;
    class QValueAxis;
    QT_CHARTS_END_NAMESPACE
    
    QT_CHARTS_USE_NAMESPACE
    
    class Chart: public QChart
    {
        Q_OBJECT
    public:
        Chart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
        void setLabelsOn(bool isOn);
        void setPenStyle(QColor color, int width);
        void setLegendOn(bool isOn);
        void setAxisGridLineOn(bool isOn);
        virtual ~Chart();
    
    public slots:
        void handleTimeout();
    
    private:
        QTimer m_timer;
        QLineSeries *m_series;
        QLineSeries *series1;
        QValueAxis *m_axisX;
        QValueAxis *m_axisY;
        qreal m_x;
        qreal m_y;
        QList<double> testList;
        QAreaSeries *areaSeries;
    };
    
    #endif /* CHART_H */
    

    chart.cpp

    #include "chart.h"
    
    Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags):
        QChart(QChart::ChartTypeCartesian, parent, wFlags),
        m_series(nullptr),
        m_x(5),
        m_y(0)
    {
        m_axisX = new QValueAxis(this);
        m_axisY = new QValueAxis(this);
        m_series = new QLineSeries(this);
        m_series->append(m_x, m_y);
        series1 = new QLineSeries(this);
        series1->append(1, 1);
        testList << 93.8436 << 777.797 << 2507.78 << 5999.44 << 6806.54 << 7481.16
                 << 8008.5 << 1500.5 << 8328.4 << 1998.4 << 9092.04 << 1885.60 << 8093.8 << 8161.83 << 8216.99
                 << 8280.46 << 8394.55 << 8469.84
                 << 8500.65 << 2500.88 << 8558.16 << 8660.9 << 8638.87
                 << 8726.47 << 8715.25 << 8804.48 << 8793.86
                 << 8839.42 << 8875.75 << 8938.24 << 8977.09
                 << 9020.27 << 9046.7 << 9092.04 << 9121.58
                 << 9155.36 << 9199.46 << 10 << 8 << 3 << 1 << 0;
        areaSeries = new QAreaSeries(m_series, series1);
        areaSeries->setBrush(QBrush(QColor(Qt::red)));
        addSeries(areaSeries);
        setAxisX(m_axisX, m_series);
        setAxisY(m_axisY, m_series);
        m_axisX->setTickCount(5);
        m_axisX->setRange(0, 5);
        m_axisY->setRange(0, 9199.4);
        connect(&m_timer, &QTimer::timeout, this, &Chart::handleTimeout);
        m_timer.setInterval(1000);
        m_timer.start();
    }
    
    void Chart::setAxisGridLineOn(bool isOn)
    {
        m_axisX->setGridLineVisible(isOn);
        m_axisY->setGridLineVisible(isOn);
    }
    
    void Chart::setLegendOn(bool isOn)
    {
        if (isOn) {
            legend()->show();
        } else {
            legend()->hide();
        }
    }
    
    void Chart::setPenStyle(QColor color, int width)
    {
        QPen pen(color);
        pen.setWidth(width);
        m_series->setPen(pen);
    }
    
    void Chart::setLabelsOn(bool isOn)
    {
        m_axisX->setLabelsVisible(isOn);
        m_axisY->setLabelsVisible(isOn);
    }
    
    void Chart::handleTimeout()
    {
        qreal x = plotArea().width() / m_axisX->tickCount();
        qreal y = (m_axisX->max() - m_axisX->min()) / m_axisX->tickCount();
        m_x += y;
    
        if (!testList.isEmpty()) {
            m_y = testList.first();
            testList.takeFirst();
        } else {
            m_timer.stop();
        }
    
        qDebug() << "m_x: " << m_x << " " << "m_y: " << m_y;
        m_series->append(m_x, m_y);
        series1->append(m_y, 0);
        scroll(x, 0);
    }
    
    Chart::~Chart()
    {
    
    }
    

    main.cpp

    #include "chart.h"
    #include <QChartView>
    #include <QApplication>
    #include <QWidget>
    #include <QHBoxLayout>
    #include <QGraphicsLayout>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWidget window;
        window.setWindowTitle("Test Chart Widget");
        Chart *chart = new Chart;
        chart->setLabelsOn(true);
        chart->setPenStyle(Qt::blue, 1);
        chart->setLegendOn(false);
        chart->setBackgroundRoundness(1);
        chart->setAxisGridLineOn(true);
        //chart->setContentsMargins(-60, -25, -25, -40);
        chart->layout()->setContentsMargins(0, 0, 0, 0);
        chart->setAnimationOptions(QChart::AllAnimations);
        QChartView chartView(chart);
        chartView.setStyleSheet("border: 1px solid blue;");
        chartView.setRenderHint(QPainter::Antialiasing);
        QHBoxLayout *layout = new QHBoxLayout();
        layout->setContentsMargins(QMargins());
        layout->addWidget(&chartView);
        window.setLayout(layout);
        window.setMinimumSize(810, 400);
        window.show();
        return a.exec();
    }
    

    How to draw it properly? Thanks.



  • Hello!

    I have fixed the issue by using QtNetworkMonitor example from GitHub. The issue is resolved.


Log in to reply