【问题标题】:QtCharts auto range for y-axisy轴的QtCharts自动范围
【发布时间】:2017-12-09 22:42:57
【问题描述】:

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

【问题讨论】:

  • 你可以展示你的尝试
  • 我附上了一张关于它的图片。
  • 您可以显示生成图表的代码。
  • 是的,我只改变了它的功能的幅度。 m_y = 50*(qrand() % 5 - 2.5);

标签: c++ qt qt5 qtcharts


【解决方案1】:

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

【讨论】:

  • 我试图在主窗口(GUI)上添加,但做不到,而且它也不是定时器的工作信号/插槽。连接只在main.cpp中运行,为什么?我哪里错了? void MainWindow::initChart() { 图表 *chart = new Chart(); chart->setTitle("动态样条图");图表->图例()->隐藏();图表->setAnimationOptions(QChart::AllAnimations); QChartView 图表视图(图表); chartView.setRenderHint(QPainter::Antialiasing); QApplication::connect(chart->m_timer, &QTimer::timeout, chart, &Chart::handleTimeout); }
  • 我做到了 :) 我应该删除 qlineseries 因为它总是在运行时附加新点。
  • @eyllanesc 由于您只跟踪最小/最大 y 值,当它不再可见并从系列中删除时会发生什么?
  • @iQt lambda 方法仍在运行,如果您想优化我的代码,请在 lambda 中添加这些要求以避免执行该逻辑
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2020-04-05
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多