欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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