首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QtCharts y轴自动量程

QtCharts y轴自动量程
EN

Stack Overflow用户
提问于 2017-07-06 05:05:28
回答 1查看 8.5K关注 0票数 4

我想用动态图自动改变y轴。我在示例中更改了动态绘图示例,并附加了许多要点。在添加了一个新的点后,该图应该调整其y轴,以考虑新的最大值。情节可以自动完成吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-06 05:39:48

我们可以使用该系列的信号pointAdded更新范围,为此我们将分别创建两个存储最大值和最小值的变量:

代码语言:javascript
复制
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

代码语言:javascript
复制
#ifndef CHART_H
#define CHART_H

#include <QtCharts/QChart>
#include <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

代码语言:javascript
复制
#include "chart.h"
#include <QtCharts/QAbstractAxis>
#include <QtCharts/QSplineSeries>
#include <QtCharts/QValueAxis>
#include <QTime>
#include <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());

    connect(&m_timer, &QTimer::timeout, this, &Chart::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();
}

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44940190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档