主要实现,当数据还未填充整个显示区时,曲线从右到左逐渐出现,当充满显示区后,旧数据用新数据来替代。
效果图如下
加强功能后的效果
添加散点图后的效果
代码如下
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("停止");
}
}
有更好意见的的朋友请留言!
曲线源码
添加散点图后的源代码
需要的朋友可以下载参考!!