使用Qchart实现曲线移动更新

主要实现,当数据还未填充整个显示区时,曲线从右到左逐渐出现,当充满显示区后,旧数据用新数据来替代。
效果图如下
这里写图片描述
加强功能后的效果
这里写图片描述
添加散点图后的效果
这里写图片描述
代码如下

main.c文件

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QSplineSeries>
#include <QtCore/QTimer>
#include <QList>
#include <QPushButton>

QT_CHARTS_USE_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(int max = 100,QWidget *parent = 0);
    ~MainWindow();
public slots:
    void handleTimeout();
    void handlebutton();
private:
    const int max_count;

    QTimer m_timer;
    QPushButton *button ;

    bool start;
    QList<int>  data;
    QSplineSeries *series;
    QChart *chart;
    QChartView *chartView;
    int count;
};

#endif // MAINWINDOW_H

mainwindow.c文件

#include "mainwindow.h"
#include <QtCore/QTime>
#include <QPushButton>
#include <QVBoxLayout>

MainWindow::MainWindow(int max,QWidget *parent)
    : QMainWindow(parent),max_count(max)
{
    count = 0;
    start = true;

    qsrand((uint) QTime::currentTime().msec());

    series = new QSplineSeries();

    chart = new QChart();
    chart->legend()->hide();
    chart->addSeries(series);
    chart->setTitle("自动移动曲线");
    chart->createDefaultAxes();
    chart->axisY()->setRange(-10, 80);
    chart->axisX()->setRange(0, max_count);

    chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);


    button = new QPushButton("停止", this);

    QObject::connect(button, SIGNAL(pressed()), this, SLOT(handlebutton()));
    QObject::connect(&m_timer, SIGNAL(timeout()), this, SLOT(handleTimeout()));
    m_timer.setInterval(100);

    QVBoxLayout *mainLayout = new QVBoxLayout();
    mainLayout->addWidget(chartView);
    mainLayout->addWidget(button);

    QWidget* widget = new QWidget(this);
    widget->setLayout(mainLayout);
    setCentralWidget(widget);
    resize(900, 800);
    m_timer.start();
}

MainWindow::~MainWindow()
{

}

void MainWindow::handleTimeout()
{
    int m_y = qrand() % 45 + 5;
    count++;
    if(count > max_count)
    {
        data.pop_front();
        data<<m_y;
        series->clear();
        for(int i =0; i<max_count;i++)
        {
            series->append(i, data.at(i));
        }
    }
    else
    {
        data<<m_y;
        series->clear();
        for(int i =0; i<count;i++)
        {
            series->append(max_count-i, data.at(count-i-1));
        }
    }
}

void MainWindow::handlebutton()
{
    if(start)
    {
        start = false;
        m_timer.stop();
        button->setText("启动");
    }
    else
    {
        start = true;
        m_timer.start();
        button->setText("停止");
    }
}

有更好意见的的朋友请留言!
曲线源码
添加散点图后的源代码
需要的朋友可以下载参考!!

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值