2017-07-06 53 views
0

我想通過使用動態圖自動更改y軸。我在示例中更改了動態繪圖示例,並添加了很多要點。附加新點後,圖應調整其y軸以考慮新的最大值。情節可能會自動執行此操作嗎?yt軸的QtCharts自動範圍

enter image description here

+0

你可以展示你試過 – eyllanesc

+0

我連着一個關於它的圖像。 –

+0

您可以顯示圖形生成的代碼。 – eyllanesc

回答

2

我們可以用一系列的信號pointAdded更新的範圍內,爲此,我們將創建分別存儲的最大值和最小值,2個變量:

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中運行,爲什麼?我在哪裏錯誤? void MainWindow :: initChart() { Chart * chart = new Chart(); chart-> setTitle(「動態樣條圖」); chart-> legend() - > hide(); chart-> setAnimationOptions(QChart :: AllAnimations); QChartView chartView(chart); chartView.setRenderHint(QPainter :: Antialiasing); QApplication :: connect(chart-> m_timer,&QTimer :: timeout,chart和Chart :: handleTimeout); } –

+0

通過github或類似方式分享您的代碼 – eyllanesc

-1

我已嘗試添加時間軸爲x軸,但我不能。時間總是相同的,所以它不會改變。爲什麼?

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

alt text