2017-07-06 24 views
0

ダイナミックプロットを使って自動的にy軸を変更したいと思います。私は、例で動的なプロットの例を変更し、多くの点を追加しました。新しい点が追加された後、プロットはy軸を調整して新しい最大値を考慮する必要があります。プロットが自動的にこれを行うことは可能ですか?QtCharts y軸の自動範囲

enter image description here

+0

あなたは、私はそれについての画像を添付 – eyllanesc

+0

をしようとしたかを示すことができました。 –

+0

グラフが生成するコードを表示することができます。 – eyllanesc

答えて

2

我々はこのために私たちは、それぞれ、最大値と最小値を格納する2つの変数を作成し、範囲を更新するために、一連の信号pointAddedを使用することができます。

connect(m_series, &QSplineSeries::pointAdded, [=](int index){ 
    qreal y = m_series->at(index).y(); 

    if(y< yMin || y > yMax){ 
     if(y < yMin) 
      yMin = y; 
     if(y> yMax) 
      yMax = y; 
     axisY()->setRange(yMin-20, yMax+20); 
    } 

}); 

完全なコードを:

chart.h

#ifndef CHART_H 
#define CHART_H 

#include <QtCharts/QChart> 
#include <QtCore/QTimer> 

QT_CHARTS_BEGIN_NAMESPACE 
class QSplineSeries; 
class QValueAxis; 
QT_CHARTS_END_NAMESPACE 

QT_CHARTS_USE_NAMESPACE 

//![1] 
class Chart: public QChart 
{ 
    Q_OBJECT 
public: 
    Chart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0); 
    virtual ~Chart(); 

public slots: 
    void handleTimeout(); 

private: 
    QTimer m_timer; 
    QSplineSeries *m_series; 
    QStringList m_titles; 
    QValueAxis *m_axis; 
    qreal m_step; 
    qreal m_x; 
    qreal m_y; 
    //new variables 
    qreal yMin; 
    qreal yMax; 
}; 
//![1] 

chart.cpp

#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(5), 
    m_y(1) 
{ 
    qsrand((uint) QTime::currentTime().msec()); 

    QObject::connect(&m_timer, SIGNAL(timeout()), this, SLOT(handleTimeout())); 
    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(5); 

    yMax = 10; 
    yMin = -5; 

    axisX()->setRange(0, 10); 
    axisY()->setRange(yMin, yMax); 

    connect(m_series, &QSplineSeries::pointAdded, [=](int index){ 
     qreal y = m_series->at(index).y(); 

     if(y< yMin || y > yMax){ 
      if(y < yMin) 
       yMin = y; 
      if(y> yMax) 
       yMax = y; 
      axisY()->setRange(yMin-20, yMax+20); 
     } 

    }); 

    m_timer.start(); 
} 

Chart::~Chart() 
{ 

} 

void Chart::handleTimeout() 
{ 
    qreal x = plotArea().width()/m_axis->tickCount(); 
    qreal y = (m_axis->max() - m_axis->min())/m_axis->tickCount(); 
    m_x += y; 
    //m_y = qrand() % 5 - 2.5; 
    m_y = 50*(qrand() % 5 - 2.5); 
    m_series->append(m_x, m_y); 
    scroll(x, 0); 
    if (m_x == 100) 
     m_timer.stop(); 
} 

enter image description here

+0

動作しています、ありがとうございます:) –

+0

メインウィンドウ(GUI)に追加しようとしましたが、できませんでした。また、タイマー用の信号/スロットも動作していません。接続はmain.cppでのみ実行されています、なぜですか?どこで間違いはありますか? MainWindow :: initChart() { Chart * chart = new Chart(); chart-> setTitle( "動的スプライン・チャート"); chart-> legend() - > hide(); chart-> setAnimationOptions(QChart :: AllAnimations); QChartView chartView(chart); chartView.setRenderHint(QPainter ::アンチエイリアス); QApplication :: connect(グラフ - > m_timer、QTimer :: timeout、chart、およびChart :: handleTimeout); } –

+0

githubなどでコードを共有する – eyllanesc

-1

私は、x軸に時間軸を追加しようとしましたが、私はできません。それは変わらないので、いつも同じです。どうして?

m_series->append(QDateTime::currentDateTime().toMSecsSinceEpoch(), m_y);

alt text

関連する問題