2017-02-09 125 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