QtCharts自动调整y轴范围

4

我希望通过使用动态图自动更改y轴。我在示例中更改了动态绘图示例,并附加了许多点。添加新点后,图应调整其y轴以考虑新的最大值。图是否可以自动执行此操作?

enter image description here


你可以展示一下你尝试过的内容。 - eyllanesc
我附上了一张关于它的图片。 - Gokhan Sahin
你可以展示生成图形的代码。 - eyllanesc
1
这是示例吗?:https://doc.qt.io/qt-5/qtcharts-dynamicspline-example.html - eyllanesc
是的,我只改变了振幅而已。m_y = 50*(qrand() % 5 - 2.5); - Gokhan Sahin
1个回答

5

我们可以使用系列的信号点 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 <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 <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();
}

enter image description here


我试图在主窗口(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); } - Gokhan Sahin
我做到了 :) 我应该删除qlineseries吗?因为它在运行时总是添加新的点。 - Gokhan Sahin
2
@eyllanesc 由于您只跟踪最小/最大 y 值,当它不再可见并从系列中移除时会发生什么? - uniquenamehere
@iQt lambda方法仍在运行,如果您想优化我的代码,请将这些要求添加到lambda中以避免执行该逻辑。 - eyllanesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接