2017-02-09 119 views
0

我正在试图制作一个实时读取数据的图表。我从Qt开始提供的名为“动态样条”的例子开始。QTCharts,当实时数据进入时,我该如何让图表沿着x轴?

我遇到的问题是,滚动()函数似乎滚动像素,并且似乎没有任何函数在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教程,无论如何,都很难找到。

回答

0

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

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

0

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

当你做你的DrawLine的检查,如果下一个点比max高,并设置如果是新的最高:

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

最大不一定得到显示。在不改变范围的情况下,最大值将不受任何投诉地直接从屏幕流出。 – granitdev