Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing real time plot with Qt5 charts

Tags:

qt5

qtcharts

I am new to Qt and trying to implement a real time plot using QSplineSeries with Qt 5.7. I need to scroll the x axis as new data comes in every 100ms. It seems the CPU usage reaches 100% if I do not purge the old data which was appended to the series, using graphSeriesX->remove(0). I found two ways of scrolling the x axis.

const uint8_t X_RANGE_COUNT = 50;
const uint8_t X_RANGE_MAX = X_RANGE_COUNT - 1;
qreal y = (axisX->max() - axisX->min()) / axisX->tickCount();
m_x += y;
if (m_x > axisX->max()) {
    axisX->setMax(m_x);
    axisX->setMin(m_x - 100);
}

if (graphSeries1->count() > X_RANGE_COUNT) {
    graphSeries1->remove(0);
    graphSeries2->remove(0);
    graphSeries3->remove(0);
}

The problem with the above is that m_x is of type qreal and at some time if I keep the demo running continuously, it will reach it's MAX value and the axisX->setMax call will fail making the plot not work anymore. What would be the correct way to fix this use case?

qreal x = plotArea().width() / X_RANGE_MAX;
chart->scroll(x, 0)
 if (graphSeries1->count() > X_RANGE_COUNT) {
            graphSeries1->remove(0);
            graphSeries2->remove(0);
            graphSeries3->remove(0);
 }

However it's not clear to me how can I use the graphSeriesX->remove(0) call in this scenario. The graph will keep getting wiped out since once the series get appended with X_RANGE_COUNT values, the if block will always be true removing 0th value but the scroll somehow does not work the way manually setting maximum for x axis works and after a while I have no graph. scroll works if I do not call remove but then my CPU usage reaches 100%.

Can someone point me in the right direction on how to use scroll while using remove to keep the CPU usage low?


1 Answers

It seems like the best way to update data for a QChart is through void QXYSeries::replace(QVector<QPointF> points). From the documentation, it's much faster than clearing all the data (and don't forget to use a vector instead of a list). The audio example from the documentation does exactly that. Updating the axes with setMin, setMax and setRange all seem to use a lot of CPU. I'll try to see if there's a way around that.

like image 90
Felipe Cortez Avatar answered Dec 24 '25 09:12

Felipe Cortez



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!