我是Qt的新手,正在尝试使用QSplineSeries和Qt5.7实现实时绘图。我需要滚动x轴,因为每隔100ms就会有新的数据进来。如果我不使用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类型的,有时如果我继续运行演示,它将达到它的最大值,并且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块将始终为真,删除第0个值,但是滚动不知何故不能以手动设置x轴的最大值的方式工作,一段时间后,我没有图形。如果我没有调用remove,但是我的CPU使用率达到了100%,那么scroll就可以工作。
有没有人可以给我指个方向,告诉我如何在使用remove的同时使用scroll来保持低CPU使用率?
发布于 2017-12-04 03:12:51
似乎更新QChart数据的最好方法是通过void QXYSeries::replace(QVector<QPointF> points)。在documentation中,它比清除所有数据要快得多(别忘了使用向量而不是列表)。文档中的audio example就是这样做的。使用setMin、setMax和setRange更新坐标轴似乎都会占用大量的CPU。我会试着看看有没有办法解决这个问题。
发布于 2017-03-16 14:20:45
你所说的“手动设置x轴最大值的方式不起作用”是什么意思?如果您将x轴范围定义为介于0和X_RANGE_MAX之间,则可以使用您展示的第二种方法。这不就是你想要的吗?
类似于:chart->axisX()->setRange(0, X_RANGE_MAX);
https://stackoverflow.com/questions/42617860
复制相似问题