1、需要在工程文件.pro文件中添加,QT += charts

2、在ui界面放置一个widget控件,并将其提升为QChartView,继承于QWidget

 如果将一个widget提升了QChartView后报错,在ui_mainwindow.h中加入

QT_CHARTS_USE_NAMESPACE

3、构造一个QChart对象;

QChart* mychart; // 构建图表类
QLineSeries *line; // 构建一个折线系列
mychart = new QChart;
    line = new QLineSeries(this); // 构建折线对象
    // 在折线上添加数据
    for(size_t i=0;i<100;i++)
    {
        line->append(i,4*sin(0.6f*i));  // 在折线上添加点
    }
    // 将折线添加到图标上
    mychart->addSeries(line);
    mychart->createDefaultAxes();  // 创建默认的坐标轴
    mychart->setTheme(QChart::ChartThemeBlueCerulean);  // 设置背景为绿色
    mychart->legend()->hide(); // 隐藏图例

    ui->widget->setChart(mychart); // 图表绑定在视图上

4、图表添加修饰

// 将折线添加到图标上
    mychart->addSeries(line);
    mychart->createDefaultAxes();  // 创建默认的坐标轴
    mychart->setTheme(QChart::ChartThemeBlueCerulean);  // 设置背景为绿色
    mychart->legend()->hide(); // 隐藏图例
    // 还是出现中文乱码?
    mychart->setTitle(QString::fromLocal8Bit("图表标题")); // 设置图表标题

    ui->widget->setChart(mychart); // 图表绑定在视图上
    // 设置反走样 折线平滑处理
    ui->widget->setRenderHint(QPainter::Antialiasing,true);

// 注意在析构的时候,释放曲线
 mychart->removeAllSeries();  // 自带的析构函数没有释放这块,自己做析构

5、使用QGraphicView绘制图表

QGraphicsScene* Space;  // 构建一个场景

在上面的基础上进行修改

Qlabel setStyleSheet 清除图片 qchartview清空_坐标轴

Qlabel setStyleSheet 清除图片 qchartview清空_sed_02

mychart = new QChart;
    line = new QLineSeries(this); // 构建折线对象
    // 在折线上添加数据
    for(size_t i=0;i<100;i++)
    {
        line->append(i,4*sin(0.6f*i));  // 在折线上添加点
    }
    // 将折线添加到图标上
    mychart->addSeries(line);
    mychart->createDefaultAxes();  // 创建默认的坐标轴
    mychart->setTheme(QChart::ChartThemeBlueCerulean);  // 设置背景为绿色
    mychart->legend()->hide(); // 隐藏图例
    // 还是出现中文乱码?
    mychart->setTitle(QString::fromLocal8Bit("图表标题")); // 设置图表标题
    mychart->setGeometry(0, 0, 300, 200); // 设置图表尺寸
    //QGraphicsItem--->mychart
    Space = new QGraphicsScene(this);  // 构建场景
    Space->addItem(mychart);      // 图表添加到视图上
    ui->graphicsView->setScene(Space);   // 给场景设置视图
    //ui->widget->setChart(mychart); // 图表绑定在视图上
    // 设置反走样 折线平滑处理
    //ui->widget->setRenderHint(QPainter::Antialiasing,true);
    ui->graphicsView->setRenderHint(QPainter::Antialiasing,true);

View Code

6、绘制动态折线图

// 构建一个定时器,移动曲线,更新曲线,定时器超时槽函数

Qlabel setStyleSheet 清除图片 qchartview清空_坐标轴

Qlabel setStyleSheet 清除图片 qchartview清空_sed_02

QChart* mychart; // 构建图表类
    //QLineSeries *line; // 构建一个折线系列
    QSplineSeries *line;  // 构建一个曲线系列
    QGraphicsScene* Space;  // 构建一个场景
    QTimer *timer; // 创建一定定时器
    QValueAxis* AxisX;  // 图表X坐标轴
    QValueAxis* AxisY;  // 图表Y坐标轴
    qint64 tmLast; // 上次进入定时器的时间
private:
    Ui::Widget *ui;
private slots:
    void Slot_Timeout();   // 定时器超时函数

View Code

在前面的基础上修改代码,构造函数

Qlabel setStyleSheet 清除图片 qchartview清空_坐标轴

Qlabel setStyleSheet 清除图片 qchartview清空_sed_02

const quint32 Max_Axis = 300; // 定义X轴坐标范围

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget), tmLast(0) // 构造函数中变量初始化
{
    ui->setupUi(this);

    mychart = new QChart;
    //line = new QLineSeries(this); // 构建折线对象
    line = new QSplineSeries(this);
    // 在折线上添加数据
    for(size_t i=0;i<Max_Axis;i++)
    {
        line->append(i,4*sin(0.6f*i));  // 在折线上添加点
    }
    // 将折线添加到图标上
    mychart->addSeries(line);
    //mychart->createDefaultAxes();  // 创建默认的坐标轴

    // 构建自己的坐标轴
    AxisX = new QValueAxis(this);
    AxisX->setRange(0, Max_Axis);
    AxisX->setTitleText(QString::fromLocal8Bit("X"));

    AxisY = new QValueAxis(this);
    AxisY->setRange(-4, 4); // 设置坐标轴范围
    AxisY->setTitleText(QString::fromLocal8Bit("Y")); // 设置Y轴坐标
    // 图表添加坐标轴
    mychart->setAxisX(AxisX, line);
    mychart->setAxisY(AxisY, line);

    mychart->setTheme(QChart::ChartThemeBlueCerulean);  // 设置背景为绿色
    mychart->legend()->hide(); // 隐藏图例
    // 还是出现中文乱码?
    mychart->setTitle(QString::fromLocal8Bit("图表标题")); // 设置图表标题
    mychart->setGeometry(0, 0, 1000, 800); // 设置图表尺寸

    //QGraphicsItem--->mychart
    Space = new QGraphicsScene(this);  // 构建场景
    Space->addItem(mychart);      // 图表添加到视图上
    ui->graphicsView->setScene(Space);   // 给场景设置视图
    //ui->widget->setChart(mychart); // 图表绑定在视图上
    // 设置反走样 折线平滑处理
    //ui->widget->setRenderHint(QPainter::Antialiasing,true);
    ui->graphicsView->setRenderHint(QPainter::Antialiasing,true);

    // QTimer
    timer = new QTimer(this);
    timer->setInterval(100);  // 设置定时器间隔
    timer->start();           //启动定时器
    // 定时器与槽函数关联
    connect(timer,&QTimer::timeout,this,&Widget::Slot_Timeout);

View Code

实现曲线,动态显示,定时器超时函数

Qlabel setStyleSheet 清除图片 qchartview清空_坐标轴

Qlabel setStyleSheet 清除图片 qchartview清空_sed_02

// 静态数据存储第一次进入定时器的时间
    static QTime tmBegin = QTime::currentTime();  // 当前时间 17:33:12.34
    //qDebug() << "tmBegin:"<<tmBegin;  //
    // tmEllaspsed: tmBegin从第一次定义到现在的时间 超时时间的n倍
    qint64 tmEllaspsed = tmBegin.elapsed();
    // qDebug() << "tmEllaspsed:"<<tmEllaspsed;
    // 计算两次进入定时器经历的时间差
    // 这样获取时间更精确
    qint64 nSkip = tmEllaspsed - tmLast;  // 约等于定时器超时时间
    //qDebug() << "nSkip:"<< nSkip;
    // 获取曲线上的点
    QVector<QPointF> ptsOld = line->pointsVector();
    QVector<QPointF> ptsNew;    // 新数据
    // 曲线上后面的数据向前移动
    qint64 i=0;
    for(i=0;i< ptsOld.count() - nSkip;i++)
    {
        ptsNew.append(QPointF(i, ptsOld[i+ nSkip].y()));
    }
    // 补充新数据
    for(i = ptsOld.count() - nSkip;i < ptsOld.count();i++)
    {
        ptsNew.append(QPointF(i,4*sin(0.6f*i)));
    }
    // 更新数据
    line->replace(ptsNew);
    // 更新上次进入定时器的时间
    tmLast = tmEllaspsed;   //取现在的时间

View Code

 7、设置坐标轴的分辨率

AxisX->setTickCount(5); // 横坐标被5等分刻度显示

8、上面刷新的曲线,但是坐标轴不动;类似心电图的曲线动,坐标轴也在刷新

Qlabel setStyleSheet 清除图片 qchartview清空_坐标轴

Qlabel setStyleSheet 清除图片 qchartview清空_sed_02

ui->setupUi(this);

    mychart = new QChart;
    //line = new QLineSeries(this); // 构建折线对象
    line = new QSplineSeries(this);
    // 在折线上添加初始化数据,第一个点
    m_x = 0.f;   // 表示第一个点的横坐标
    m_x= 300;  // 第一个点的初始化横坐标在8的位置上
    // 曲线上添加第一个点,第一个点的位置决定曲线终点的位置
    line->append(m_x, 1);


    // 将折线添加到图标上
    mychart->addSeries(line);
    //mychart->createDefaultAxes();  // 创建默认的坐标轴

    // 构建自己的坐标轴
    AxisX = new QValueAxis(this);
    AxisX->setRange(0, Max_Axis);
    AxisX->setTitleText(QString::fromLocal8Bit("X"));
    AxisX->setLabelFormat("%g");    // 去掉多余的0
    AxisX->setTickCount(5); // 横坐标被分割5份 显示

    AxisY = new QValueAxis(this);
    AxisY->setRange(-4, 4); // 设置坐标轴范围
    AxisY->setTitleText(QString::fromLocal8Bit("Y")); // 设置Y轴坐标
    // 图表添加坐标轴
    mychart->setAxisX(AxisX, line);
    mychart->setAxisY(AxisY, line);

    mychart->setTheme(QChart::ChartThemeBlueCerulean);  // 设置背景为绿色
    mychart->legend()->hide(); // 隐藏图例
    // 还是出现中文乱码?
    mychart->setTitle(QString::fromLocal8Bit("图表标题")); // 设置图表标题
    mychart->setGeometry(0, 0, 800,   600); // 设置图表尺寸

    //QGraphicsItem--->mychart
    Space = new QGraphicsScene(this);  // 构建场景
    Space->addItem(mychart);      // 图表添加到视图上
    ui->graphicsView->setScene(Space);   // 给场景设置视图
    //ui->widget->setChart(mychart); // 图表绑定在视图上
    // 设置反走样 折线平滑处理
    //ui->widget->setRenderHint(QPainter::Antialiasing,true);
    ui->graphicsView->setRenderHint(QPainter::Antialiasing,true);

    // QTimer
    timer = new QTimer(this);
    timer->setInterval(200);  // 设置定时器间隔
    timer->start();           //启动定时器
    // 定时器与槽函数关联
    connect(timer,&QTimer::timeout,this,&Widget::Slot_Timeout);

View Code

Qlabel setStyleSheet 清除图片 qchartview清空_坐标轴

Qlabel setStyleSheet 清除图片 qchartview清空_sed_02

qreal xOffset = 0.f;  // 定义一个数据偏移量
    qreal dIncrease = 0.5;  // 每个数据的x轴增加1
    for(int i=0;i<10;i++)
    {
        m_x += dIncrease;
        xOffset += dIncrease;
        line->append(m_x, qrand()%4);
    }
    if(line->count()*dIncrease > 500)
    {
        line->removePoints(0,line->count() - 500);
    }
    // 单位x轴上长度
    qreal xUnit = mychart->plotArea().width()/(AxisX->max()-AxisX->min());
    qreal xScrell = xUnit * xOffset; // 需要滚动的值
    mychart->scroll(xScrell, 0); // 取得是变化量

View Code