Solved QtCharts setRange issue
-
Hello!
I want to display some data using
QtCharts
. I have tried theDynamicSpline
example, it works well but when I set my data then nothing is displayed. I think the problem is with thesetRange
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:
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:
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.