【QT绘制动态图像】基于C++、QT的Windows平台简易上位机软件开发
程序员文章站
2024-01-15 19:01:34
...
利用QT和QCustomplot绘制实时曲线
开发板采用的野火指南者,上位机程序采用的QCustomPlot进行绘制。代码非常简单,见下文。。。
1:mainwindow.cpp
在这里插入代码片
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//this->setCentralWidget(ui->widget_plot);
this->timer.start(1);
//给按键容器和文本编辑框容器进行赋值
pb_CloseCon=ui->Pb_CloseCon;
pb_StartCon=ui->Pb_StartCon;
Ed_Show=ui->Ed_Show;
lb_comState=ui->lb_comState;
//给串口接口指针进行初始化
serialPort=new QSerialPort();
//将信号与槽进行相应的连接
connect(pb_StartCon,SIGNAL(clicked()),this,SLOT(on_Pb_StartCon_Li()));
connect(pb_CloseCon,SIGNAL(clicked()),this,SLOT(on_Pb_CloseCon_Li()));
connect(&timer,SIGNAL(timeout()),this,SLOT(flash_plot()));
}
MainWindow::~MainWindow()
{
delete ui;
}
//展示曲线
void MainWindow::showPlot()
{
//获取曲线图层0,即第一个图层
pCustomPlot=ui->widget_plot;
pCPGraph0=ui->widget_plot->addGraph(0);
//获取横坐标的标签
pXAxis0=ui->widget_plot->xAxis;
pXAxis1=ui->widget_plot->xAxis2;
//获取纵坐标的标签
pYAxis0=ui->widget_plot->yAxis;
pYAxis1=ui->widget_plot->yAxis2;
//设置横坐标和纵坐标的标签名称
pXAxis0->setLabel("x");
pXAxis1->setLabel("x1");
pYAxis0->setLabel("y");
pYAxis1->setLabel("y1");
//设置显示范围
pXAxis0->setRange(0,50);
pYAxis0->setRange(-3,5);
//设置曲线图层画笔的颜色
pCPGraph0->setPen(QPen(Qt::red));
//初始化曲线中的数据
for(int i=0;i<this->xDate.length();i++)
{
this->xDate[i]=i;
this->yDate[i]=i;
}
pCPGraph0->setData(this->xDate,this->yDate);
this->pCustomPlot->replot();
}
//时钟中断相应函数
void MainWindow::flash_plot()
{
char rx_buff[1024];
float data;
// qDebug()<<count<<endl;
// count++;
if(serialPort->isOpen())
{
serialPort->readLine(rx_buff,sizeof (rx_buff));
QString des = QString::fromLocal8Bit(rx_buff);
data=des.toFloat();
if(data!=0)
{
//左移曲线中的数据
for(int i=0;i<this->xDate.length();i++)
{
if(i==this->xDate.length()-1)
this->yDate[i]=data;
else
this->yDate[i]=this->yDate[i+1];
}
//this->yDate[this->xDate.length()-1]=data;
pCPGraph0->setData(this->xDate,this->yDate);
this->pCustomPlot->replot();
Ed_Show->append(QString("%1").arg(data));
}
}
}
void MainWindow::on_Pb_StartCon_Li()
{
serialPort->setPortName("COM4");
serialPort->setDataBits(QSerialPort::Data8);
serialPort->setParity(QSerialPort::NoParity);
serialPort->setFlowControl(QSerialPort::NoFlowControl);
serialPort->setStopBits(QSerialPort::OneStop);
serialPort->setBaudRate(115200);
if(!serialPort->open(QIODevice::ReadWrite))
{
qDebug()<<"串口打开失败"<<endl;
lb_comState->setText("串口状态:关闭");
return;
}
qDebug()<<"串口打开成功"<<endl;
lb_comState->setText("串口状态:打开");
}
void MainWindow::on_Pb_CloseCon_Li()
{
serialPort->close();
qDebug()<<"串口关闭"<<endl;
lb_comState->setText("串口状态:关闭");
}
2:mainwindow.h
在这里插入代码片
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QPen>
#include<QtCore/qmap.h>
#include<QTimer>
#include"math.h"
#include<QtDebug>
#include"qcustomplot.h"
#include<QVector>
#include<QSerialPort>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
void showPlot();
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QTimer timer;
int count=0;
//创建指针变量获取目标
QCustomPlot *pCustomPlot;
QCPGraph *pCPGraph0;
QCPAxis *pXAxis0,*pXAxis1,*pYAxis0,*pYAxis1;
//创建列表中的数据
QVector<double> xDate=QVector<double>(50);
QVector<double> yDate=QVector<double>(50);
//给按钮和显示窗口添加接受器
QPushButton *pb_StartCon;
QPushButton *pb_CloseCon;
//给文本编辑框添加接收器
QTextEdit *Ed_Show;
//创建进行连接的接口对象
QSerialPort *serialPort;
//创建显示串口状态的标签的容器
QLabel *lb_comState;
public slots:
//添加时钟相应的槽函数
void flash_plot();
//添加按键相应的槽函数
void on_Pb_StartCon_Li();
void on_Pb_CloseCon_Li();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H