QT——Qchart实时动态曲线绘制

以下绘制以时间为横坐标,以随机数为纵坐标的实时动态曲线,此例子是每隔1s更新曲线。

以下是效果图:

1.在UI面板中添加Graphics View,并选择合适位置

QT——Qchart实时动态曲线绘制_第1张图片

 2.点击鼠标右键,选择提升为QChart View.

QT——Qchart实时动态曲线绘制_第2张图片

3.在.pro文件中添加以下代码:

QT       +=charts

4.h文件内容

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
QT_CHARTS_USE_NAMESPACE
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    int a;
    QTimer *timerDrawLine;
    void Chart_Init();
    void  DrawLine();
    QChart *chart;
    QSplineSeries *lineSeries;
    QDateTime curDateTIme = QDateTime::currentDateTime();

};
#endif // MAINWINDOW_H

 5..cpp主代码

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Chart_Init();

    timerDrawLine = new QTimer();
    timerDrawLine->start(1000);
    connect(timerDrawLine,&QTimer::timeout,[=](){
    DrawLine();
    });
}

6.Chart_Init()的作用是对曲线进行基本设置

void MainWindow::Chart_Init()
{
    //初始化QChart
    chart = new QChart();
    //初始化QSplineSeries
    lineSeries = new QSplineSeries();
    //设置曲线的名称
    lineSeries->setName("随机数测试曲线");
    //把曲线添加到QChart的实例chart中
    chart->addSeries(lineSeries);
    //声明并初始化X轴、两个Y轴
    QDateTimeAxis *axisX = new QDateTimeAxis();//x轴为时间轴
    QValueAxis *axisY = new QValueAxis();


    //设置x坐标轴
    axisX->setTitleText("时间(分:秒)");
    // 隐藏背景网格X轴框线
    axisX->setGridLineVisible(false);
    // x轴显示的文字倾斜角度
    axisX->setLabelsAngle(0);
    // 轴上点的个数
    axisX->setTickCount(10);
    axisX->setFormat("mm:ss");

    //设置y坐标轴上的格点
    axisY->setTickCount(10);   
    axisY->setMin(-5);
    axisY->setMax(20);
    //设置坐标轴显示的名称
    QFont font("Microsoft YaHei",8,QFont::Normal);//微软雅黑。字体大小8
    axisX->setTitleFont(font);
    axisY->setTitleFont(font);
    axisX->setTitleText("X-Test");
    axisY->setTitleText("mm:ss");
    //设置网格不显示
    axisY->setGridLineVisible(false);
    
    //把曲线关联到坐标轴
    lineSeries->attachAxis(axisX);
    lineSeries->attachAxis(axisY);
    //把chart显示到窗口上
    ui->graphicsView->setChart(chart);
    // 设置渲染:抗锯齿,如果不设置那么曲线就显得不平滑
    ui->graphicsView->setRenderHint(QPainter::Antialiasing);     
}

7.每隔1s更新坐标,更新的槽函数为DrawLine().

void MainWindow:: DrawLine()
 {
        // 更新X轴的范围
        chart->axisX()->setMin(QDateTime::currentDateTime().addSecs(-1*10));
        chart->axisX()->setMax(QDateTime::currentDateTime().addSecs(0));
        //在线上添加点
        lineSeries->append(QDateTime::currentDateTime().toMSecsSinceEpoch(), rand()%20);
 }

你可能感兴趣的:(qt,c++)