使用Qt5图表实现实时绘图

时间:2017-03-06 05:01:05

标签: qt5 qtchart

我是Qt的新手,并尝试使用QSplineSeries与Qt 5.7实现实时情节。我需要滚动x轴,因为新数据每100毫秒进入一次。如果我不使用graphSeriesX-> remove(0)清除附加到系列中的旧数据,则CPU使用率似乎达到100%。我找到了两种滚动x轴的方法。

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);
}

上面的问题是m_x是qreal类型,并且在某些时候如果我让演示连续运行,它将达到它的MAX值并且axisX-> setMax调用将失败不再工作了。修复此用例的正确方法是什么?

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);
 }

但是我不清楚如何在这种情况下使用graphSeriesX-> remove(0)调用。由于一旦系列附加了X_RANGE_COUNT个值,图表将继续被删除,if块将始终为true,删除第0个值,但滚动以某种方式不起作用的方式手动设置x轴工作的最大值并且过了一段时间我没有图形。滚动工作,如果我不调用删除但我的CPU使用率达到100%。

有人能指出我在使用删除时如何使用滚动以保持CPU使用率低的正确方向吗?

2 个答案:

答案 0 :(得分:3)

似乎更新QChart数据的最佳方法是void QXYSeries::replace(QVector<QPointF> points)。从documentation开始,它比清除所有数据要快得多(并且不要忘记使用向量而不是列表)。文档中的audio example就是这样做的。使用setMinsetMaxsetRange更新轴似乎都使用了大量CPU。我会试着看看是否有办法解决这个问题。

答案 1 :(得分:0)

你的意思是“手动设置x轴工作的最大值的方式不起作用”?如果您将x轴范围定义为0X_RANGE_MAX之间,则显示的第二种方法有效。这不是你想要的吗?

类似于:chart->axisX()->setRange(0, X_RANGE_MAX);