2017-02-09 32 views
0

私はデータをライブで読み込むチャートを作ろうとしています。私は、「動的スプライン」と呼ばれるQt提供の例から始めました。QTCharts、ライブデータが入ってくるとグラフをx軸に沿ってどのようにしますか?

私が抱えている問題は、scroll()関数がピクセルをスクロールするように見えて、Qtにスクロールしてデータとともに表示される関数がないようです。だから私はpixesスクロールカウントを正確に取得しない限り、私のプロットラインは、もはや目に見えなくなるまで成長するか、プロットラインを残してチャートをスクロールします。

これは私にとっては、誰もがダイナミックなグラフで使用するかなり明白な機能のようなものなので、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

scrollXの代わりに、axisXの最大値を変更してみてください。

あなたは次の点が最大値より高い場合、あなたのDrawLineチェックを行い、YESの場合新しい最大を設定します。maxは必ずしも表示されません

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

。範囲を変更せずに、最大値は苦情なしに画面からすぐに流れます。 – granitdev

関連する問題