效果图:
ui界面:(选中框是QWidget,放入ui后需要将它提升为QChartView)
代码区.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSerialPort> //提供访问串口的功能
#include <QSerialPortInfo> //提供系统中存在的串口的信息
#include<QtCharts>
QT_CHARTS_USE_NAMESPACE
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
void createXY();
~MainWindow();
protected:
void readyReadData();
private slots:
void updata_plot();
void on_pushButton_clicked();
void on_pushButtonoff_clicked();
private:
QTimer *timer_plot;
//曲线
QSplineSeries* line;
//曲线点的最大数量
int line_max = 100;
//绘图变量和坐标
QChart* chart;
//QValueAxis *axisX;
//QValueAxis *axisY;
QVector<QPointF> list;//保存心跳点
double tim=0;//时间
//int t=0;
//创建串口对象
QSerialPort serial;
int heartnum=10;
QByteArray array;
int timeid;
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QTimer>
//#include <QSerialPort> //提供访问串口的功能
//#include <QSerialPortInfo> //提供系统中存在的串口的信息
#include<QPen>
#include<QPainter>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
timer_plot = new QTimer(this);
connect(timer_plot,SIGNAL(timeout()),this,SLOT(updata_plot()));
line = new QSplineSeries(this);
chart = new QChart();
chart->addSeries(line);
//QPointF p1(0,180);
//list.push_back(p1);
//通过QSerialPortInfo查找可用串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
qWarning() << info.portName();
}
//设置串口名COM1
serial.setPortName("COM5");
//设置波特率
serial.setBaudRate(QSerialPort::Baud9600);
//设置数据位数8位
serial.setDataBits(QSerialPort::Data8);
//设置无奇偶校验
serial.setParity(QSerialPort::NoParity);
//设置停止位1位
serial.setStopBits(QSerialPort::OneStop);
//设置没有流控制
serial.setFlowControl(QSerialPort::NoFlowControl);
//读写方式打开串口
serial.open(QIODevice::ReadWrite);
// 连接信号和槽
//connect(&serial,&QSerialPort::readyRead,this,&MainWindow::readyReadData);
connect(&serial,&QSerialPort::readyRead,
[=]()
{
QByteArray buffer = serial.readAll();
char *m=buffer.data();
QString str=m;
heartnum=str.mid(4,6).toInt();
ui->textEdit->setText(m);
//t=t+5;
QPointF p(tim,heartnum);
list.push_back(p);
}
);
//serial.close();
}
void MainWindow::updata_plot()
{
line->replace(list);//替换更新
line->setName("heart");//设置曲线名称
line->setPen(QColor(255, 0, 0));//设置曲线颜色
line->setUseOpenGL(true);//openGl 加速
chart->setTitle("呼吸曲线");//设置图标标题
chart->removeSeries(line);
chart->addSeries(line);
chart->createDefaultAxes();//设置坐标轴
//chart->axisX()->setRange(0,180);
chart->axisY()->setRange(0,180);
ui->widget->setChart(chart);
tim+=0.05;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
timer_plot->start(50);//启动定时器
}
void MainWindow::on_pushButtonoff_clicked()
{
timer_plot->stop();//关闭定时器
}