一、效果图
二、代码
#ifndef DYNAMICSINCHART_H
#define DYNAMICSINCHART_H
#include <QObject>
#include <QWidget>
#include <QtCharts>
#include <QtCharts/QSplineSeries>
#include <QDateTime>
class DynamicSinChart : public QWidget
{
Q_OBJECT
public:
DynamicSinChart(QWidget* parent = nullptr);
void init();
private slots:
void on_timeout();
private:
QSplineSeries *series1;
QSplineSeries *series2;
QChart *chart;
};
#endif // DYNAMICSINCHART_H
#include "dynamicsinchart.h"
DynamicSinChart::DynamicSinChart(QWidget *parent):
QWidget (parent)
{
resize(parent->size());
show();
init();
}
void DynamicSinChart::init()
{
series1 = new QSplineSeries;
series1->setName("series1");
series2 = new QSplineSeries;
series2->setName("series2");
chart = new QChart;
chart->setAnimationOptions(QChart::SeriesAnimations); // 设置显示时的动画效果
chart->addSeries(series1);
chart->addSeries(series2);
QDateTimeAxis *axisX = new QDateTimeAxis();
QValueAxis *axisY_1 = new QValueAxis();
QValueAxis *axisY_2 =new QValueAxis();
axisX->setMin(QDateTime::currentDateTime().addSecs(-10*1));
axisX->setMax(QDateTime::currentDateTime().addSecs(0));
axisY_1->setMin(0);
axisY_1->setMax(18);
axisY_2->setMin(0);
axisY_2->setMax(18);
axisY_1->setTickCount(7);
axisY_2->setTickCount(11);
axisX->setTitleText("x-axis");
axisY_1->setTitleText("Line1");
axisY_2->setTitleText("Line2");
axisY_1->setLinePenColor(QColor(Qt::darkBlue));
axisY_1->setGridLineColor(QColor(Qt::darkBlue));
axisY_2->setLinePenColor(QColor(Qt::darkGreen));
axisY_2->setGridLineColor(QColor(Qt::darkGreen));
axisY_1->setGridLineVisible(false);
axisY_2->setGridLineVisible(false);
QPen penY1(Qt::darkBlue, 3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin);
QPen penY2(Qt::darkGreen,3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin);
axisY_1->setLinePen(penY1);
axisY_2->setLinePen(penY2);
chart->addAxis(axisX,Qt::AlignBottom);
chart->addAxis(axisY_1,Qt::AlignLeft);
chart->addAxis(axisY_2,Qt::AlignRight);
series1->attachAxis(axisX);
series1->attachAxis(axisY_1);
series2->attachAxis(axisX);
series2->attachAxis(axisY_2);
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing); //抗锯齿渲染
chartView->setParent(this);
chartView->resize(this->size());
chartView->show();
QTimer *timer = new QTimer;
timer->start(200);
connect(timer,SIGNAL(timeout()),this,SLOT(on_timeout()));
}
void DynamicSinChart::on_timeout()
{
//每增加一个点改变X轴的范围,实现曲线的动态更新效果
QDateTime bjtime = QDateTime::currentDateTime();
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
chart->axisX()->setMin(QDateTime::currentDateTime().addSecs(-10*1));
chart->axisX()->setMax(QDateTime::currentDateTime().addSecs(0));
if(series1->count()>219)
{
series1->removePoints(0,series1->count()-219);
}
if(series2->count()>219)
{
series2->removePoints(0,series2->count()-219);
}
int y1 = qrand()%9+0.8;
int y2 = 9 + qrand()%9;
series1->append(bjtime.toMSecsSinceEpoch(),y1);
series2->append(bjtime.toMSecsSinceEpoch(),y2);
}
e-mail:[email protected]