QT绘制动态的波形曲线Demo


效果图

正弦波效果

插曲

(动态图的制作,使用FastStone Capture软件,注册见博客)

工程文件

在这里插入图片描述

使用qchart进行绘制

mainwindow头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCharts/QChartView>//显示图表
#include <QtCharts/QLineSeries>//线系列
#include <QDoubleSpinBox>
#include <QGridLayout>
#include <QTimer>
#include <QtCharts/QSplineSeries>
#include <QtCharts/QValueAxis>

QT_CHARTS_USE_NAMESPACE

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void RealtimeDataSlot();

private:
    Ui::MainWindow *ui;
    QTimer m_timer;
    QChart chart;
    QSplineSeries m_series;
    QStringList m_titles;
    QValueAxis m_axis;
    qreal m_step;
    qreal m_x;
    qreal m_y;
};

#endif // MAINWINDOW_H

mainwindow定义文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QTime"
#include "QDebug"
#include "qmath.h"
#include "QValueAxis"
#include "QDateTimeAxis"
#include "QRandomGenerator"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("动态正弦波形图");
    connect(&m_timer,SIGNAL(timeout()),this,SLOT(RealtimeDataSlot()));
    m_timer.setInterval(1000);
    m_x=0;
    m_y=0;

    chart.setTheme(QChart::ChartThemeBlueCerulean);//设置系统主题
    chart.setTitle("动态正弦波形图");//设置标题
    chart.setTitleFont(QFont("微软雅黑",10));
    chart.legend()->hide();


    QPen green(Qt::yellow);
    green.setWidth(2);
    m_series.setPen(green);
    m_series.append(m_x, m_y);

    chart.addSeries(&m_series);
    chart.createDefaultAxes();
    chart.setAxisX(&m_axis,&m_series);
    m_axis.setTickCount(5);
    chart.axisX()->setRange(0,10);
    chart.axisY()->setRange(-1, 1);



    QChartView *chartView = new QChartView(&chart);
    QGridLayout *baseLayout = new QGridLayout(); //便于显示,创建网格布局

    chartView->setRenderHint(QPainter::Antialiasing);

    baseLayout->addWidget(chartView, 0, 0);
    ui->widgetWaveForm->setLayout(baseLayout); //显示到QWidget控件

    m_timer.start();
}
void MainWindow::RealtimeDataSlot()
{
    qreal x = chart.plotArea().width()/m_axis.tickCount();
    qreal y = 10/m_axis.tickCount();
    m_x += y;
    m_y=sin(m_x);
    m_series.append(m_x, m_y);
    chart.scroll(x/2, 0);
    /*if (m_x == 100)
        m_timer.stop();*/
}
MainWindow::~MainWindow()
{
    delete ui;
}

mainwindow ui

在这里插入图片描述

环境

在这里插入图片描述