2

我是 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%。

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

4

2 回答 2

3

似乎更新 QChart 数据的最佳方式是通过void QXYSeries::replace(QVector<QPointF> points). 从文档来看,它比清除所有数据要快得多(并且不要忘记使用向量而不是列表)。文档中的音频示例正是这样做的。setMin用,更新轴似乎都使用了大量的 CPU setMaxsetRange我会尝试看看是否有办法解决这个问题。

于 2017-12-03T19:12:50.720 回答
0

“不能像手动设置 x 轴的最大值那样工作”是什么意思?0如果您将 x 轴范围定义为介于和之间,则显示的第二种方法有效X_RANGE_MAX。这不是你所追求的吗?

就像是:chart->axisX()->setRange(0, X_RANGE_MAX);

于 2017-03-16T06:20:44.847 回答