QTCharts,当实时数据进入时,我如何使图表遵循x轴

QTCharts, how do I make the chart follow the x-axis as live data comes in?

本文关键字:何使图 实时 数据 QTCharts      更新时间:2023-10-16

我正在尝试制作一个实时读取数据的图表。我从Qt提供的称为"动态样条曲线"的示例开始。

我遇到的问题是,scroll()函数似乎可以滚动像素,而Qt中似乎没有任何函数可以随数据一起滚动。因此,除非我的像素滚动计数准确无误,否则要么我的绘图线会增长,直到末端不再可见,要么图表会继续滚动,留下绘图线。

对我来说,这是一个每个人都会在动态图表中使用的相当明显的功能,所以我要问一个问题:我缺少Qt图表中的什么功能来做到这一点?

我所有的搜索都是徒劳的,我甚至找不到关于如何在Qt图表中使用动态数据收集的教程。

#include "chart.h"
#include <QtCharts/QAbstractAxis>
#include <QtCharts/QSplineSeries>
#include <QtCharts/QValueAxis>
#include <QtCore/QTime>
#include <QtCore/QDebug>
Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags):
QChart(QChart::ChartTypeCartesian, parent, wFlags),
m_series(0),
m_axis(new QValueAxis),
m_step(0),
m_x(10),
m_y(1)
{
qsrand((uint) QTime::currentTime().msec());
QObject::connect(&m_timer, SIGNAL(timeout()), this, SLOT(drawChart()));
m_timer.setInterval(1000);
m_series = new QSplineSeries(this);
QPen green(Qt::red);
green.setWidth(3);
m_series->setPen(green);
m_series->append(m_x, m_y);
addSeries(m_series);
createDefaultAxes();
setAxisX(m_axis, m_series);
//    m_axis->setTickCount(11);
axisX()->setRange(0, 100);
axisY()->setRange(-5, 10);
m_timer.start();
elapsedTime.start();
}
Chart::~Chart()
{
}
void Chart::drawLine(qreal &x, qreal &y)
{
m_series->append(x, y);
}
qreal Chart::getTime()
{
return elapsedTime.elapsed() / 100;
}
void Chart::drawChart()
{
qreal x = plotArea().width() / m_axis->tickCount();
qreal y = (m_axis->max() - m_axis->min()) / m_axis->tickCount();
m_x = getTime();
m_y = qrand() % 5 - 2.5;
drawLine(m_x, m_y);
scroll(x, 0);
qDebug() << getTime();
}

代码非常简单,现在正在绘制,但线条和滚动完全不一致。由于我想用时间作为我的X轴,而不能用这个例子的不可伸缩的方式来设置。

现在它只是在绘制一个随机数。在我把这个滚动的东西整理好之前,我不会麻烦给它提供实际的数据。

提前感谢您的帮助。如果你知道一些关于Qt图表的好教程,我会非常感激。Qt教程,好的教程,无论如何,都很难找到。

我费了很大的劲,把东西扔到墙上看是什么卡住了,我发现滚动不是你应该使用的。您希望将范围与x值绑定,并在每次添加数据时更新它。这确实会迫使图形与数据线一起滚动。

新的问题,Qt中的图表有一个内置的内存泄漏。

不要滚动,而是尝试更改axisX的最大值。

当你进行绘图时,检查下一个点是否高于最大值,如果是,则设置新的最大值:

if (m_x > m_axisX->max())
{
m_axisX->setMax(m_x);
}