运行截图如下:
逻辑很简单,下面直接放代码:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QChartView>
#include <QValueAxis>
#include <QTimerEvent>
#include <QLineSeries>
#include <time.h>
QT_CHARTS_USE_NAMESPACE
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void timerEvent(QTimerEvent *event);
void initWidget();
public slots:
void pbtnClicked();
private:
Ui::Widget *ui;
QLineSeries *m_series1;
QChart *m_chart;
//x轴&y轴
QValueAxis *m_axisX;
QValueAxis *m_axisY;
int m_x;
int m_timerId;
int m_lowPos;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),m_x(1),m_lowPos(20),
ui(new Ui::Widget)
{
ui->setupUi(this);
initWidget();
this->setWindowTitle(tr("CSDN IT1995"));
srand((unsigned)time(NULL));
}
void Widget::initWidget(){
m_series1=new QLineSeries();
QPen pen(QColor(120,152,2));
m_series1->setPen(pen);
m_series1->setName(tr("访问量"));
//首先随便建几个
m_series1->append(0,5);
m_series1->append(1,7);
m_chart=new QChart();
m_chart->addSeries(m_series1);
m_chart->createDefaultAxes();
m_chart->setTitle(tr("动态折线图"));
//设置坐标
m_axisX=new QValueAxis();
m_axisX->setTitleText(tr("时间/秒"));
m_axisY=new QValueAxis();
m_axisY->setTitleText(tr("人数/个"));
m_chart->setAxisX(m_axisX,m_series1);
m_chart->setAxisY(m_axisY,m_series1);
ui->widget->setChart(m_chart);
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(pbtnClicked()));
}
void Widget::pbtnClicked(){
m_timerId=startTimer(80);
}
void Widget::timerEvent(QTimerEvent *event){
if(event->timerId()==m_timerId){
int num=rand()%1501+1;
m_x++;
qDebug()<<"m_x:"<<m_x<<" "<<"m_lowPos:"<<m_lowPos;
m_series1->append(m_x,num);
m_axisX->setRange(0,m_x);
m_axisY->setRange(0,1500);
if(m_x-20>m_lowPos){
m_axisX->setRange(m_lowPos++,m_x);
}
}
}
Widget::~Widget()
{
delete ui;
}