qt和matlab进程通信,用QtCharts绘制动态折线图

一. 内容简介

qt和matlab进程通信,获取matlab中实时计算数据,用QtCharts绘制动态折线图。
这个通信可以借鉴linux中进程通信的原理,管道通信,那么我们可以用txt文件来当作管道,给C++和matlab通信用。

二. 软件环境

2.1QT 5.14.1

QT编译器采用的是MSVC2017 64bit

2.2MatlabR2022b(64位)

2.3Visual studio 2017

Visual stdio采用2017主要是因为QT5.14.1最高到MSVC2017 64bit。

三.主要流程

3.1 qt使用QtCharts绘制折线图

3.2 matlab中写数据

3.3 折线图实时更新

3.4 结果展示

四.具体步骤

4.1 qt使用QtCharts绘制折线图

在项目中使用charts模块,必须要在项目中配置文件.pro中增加下面一行语句

QT += charts

头文件

#include <QMainWindow>
#include <QtDataVisualization>
#include <QSurface>
#include <QBoxLayout>

#include <QtCharts>
#include <QChartView>
QT_CHARTS_USE_NAMESPACE
#include <QLineSeries>
#include <QDateTimeAxis>
#include <QValueAxis>

#include <QTimer>
#include <QDateTime>
#include <math.h>

搭建二维显示模块,ui文件中添加Graphics View,然后提升为图中的就可以了。
在这里插入图片描述
在这里插入图片描述
二维框架,

void MainWindow::CreatCharts()
{
    
    
    qchart = new QChart;
    //把chart放到容器里
    ui->charts->setChart(qchart);
    //设置抗锯齿
    ui->charts->setRenderHint(QPainter::Antialiasing);
    //创建两条线
    ser0 = new QLineSeries;
    //设置名字
    ser0->setName("ser0");
    //放入charts里
    qchart->addSeries(ser0);
    //创建x坐标
    QValueAxis *Qax = new QValueAxis;
    Qax->setTickCount(11);
    //设置范围
    Qax->setRange(0,1);
    //创建y坐标
    QValueAxis *QaY = new QValueAxis;
    //设置范围
    QaY->setRange(-6,0);
    QaY->setTickCount(11);
    //将线条放入表中
    qchart->setAxisX(Qax,ser0);
    qchart->setAxisY(QaY,ser0);
}

4.2 matlab中写数据

这样子循环记录数据

fileID = fopen('data.txt','w');
t1=clock;
while
    t2=clock;
    if etime(t2,t1)>=0.1
         t1 = clock;
         fprintf(fileID,'%d %f %f\n',aaaa,log10(sss),log10(ss));
    end
end
fclose(fileID);

4.3 折线图实时更新

这里可以给二维框架更新一下
头文件

    QValueAxis *curAxis; //当前坐标轴
    QValueAxis *curAyis; //当前坐标轴
    QTimer * timer;
    QLineSeries *ser0;
    QLineSeries *ser1;
    QChart *qchart;
    int minnnn=0;
    int maxxxx=0;
    int i=0;
    int moddd;
    // 初始化一个图表对象

    qchart = new QChart;
    ui->chartView->setChart(qchart);
    // 设置抗锯齿
    ui->chartView->setRenderHint(QPainter::Antialiasing);
    // 创建两条线
    ser0 = new QLineSeries;
    ser1 = new QLineSeries;
    // 设置名字
    ser0->setName("压力残差");
    ser1->setName("温度残差");
    // 放入charts里
    qchart->addSeries(ser0);
    qchart->addSeries(ser1);
    // 创建x坐标
    QValueAxis *Qax = new QValueAxis;
    Qax->setTickCount(11);
    // 设置范围
    Qax->setRange(0, 10);
    curAyis = Qax;
    // 创建y坐标
    QValueAxis *QaY = new QValueAxis;
    // 设置范围
    QaY->setRange(-1, 0);
    QaY->setTickCount(11);
    curAxis=QaY;
    // 将线条放入表中
    qchart->setAxisX(Qax, ser0);
    qchart->setAxisY(QaY, ser0);
    qchart->setAxisX(Qax, ser1);
    qchart->setAxisY(QaY, ser1);
    curAyis->setLabelFormat("%d");
    curAxis->setLabelFormat("%.1f");
    // 加个时钟
    timer = new QTimer;
    timer->setInterval(100);
    // 这个连接创建多次,就会响应多次,
    connect(timer, SIGNAL(timeout()), this, SLOT(RefreshTime_Slot()));
    
	timer->start();

绑定的事件

void MainWindow::RefreshTime_Slot()
{
    
    
    // 输出信息至文件中(读写、追加形式)
    QString sss;
    int step;
    float cc1;
    float cc2;
    QFile file("data.txt");
    file.open(QIODevice::ReadOnly);
    double aaa = 0, bbb = 0;
    int mmm;
    int aaa1 = 0, bbb1 = 0;
    if (file.isOpen())
    {
    
    
        i = 0;
        ser0->clear();
        ser1->clear();
        QByteArray array;
        while (!file.atEnd()) // 判断是否读到文件尾
        {
    
    
            array = file.readLine(); // 按行读,追加
            i++;
            sss = array;
            sscanf(sss.toStdString().c_str(), "%d %f %f", &step, &cc1, &cc2);
            if ((moddd == 3) || (moddd == 4))
            {
    
    
                ser0->append(step, cc1);
                ser1->append(step, cc2);
                if (step >= aaa)
                {
    
    
                    aaa = aaa + (int)(step * 0.2);
                    //                aaa = aaa + 150;
                    qchart->axisX()->setMax(aaa);
                }
                int mmmmmm = ((int)cc1/0.5);
                if(mmmmmm <= (minnnn)){
    
    
                    minnnn = mmmmmm;
                    qchart->axisY()->setMin(minnnn*0.5-1);
                    curAxis->setTickCount(((int)cc1/0.5)*(-1)+3);
                }
            }
            else
            {
    
    
                ser0->append(step, cc1);
                if (step >= aaa)
                {
    
    
                    aaa = aaa + (int)(step * 0.2);
                    //                aaa = aaa + 150;
                    qchart->axisX()->setMax(aaa);
                }

                int mmmmmm = ((int)cc1/0.5);
                if(mmmmmm <= (minnnn)){
    
    
                    minnnn = mmmmmm;
                    qchart->axisY()->setMin(minnnn*0.5-1);
                    curAxis->setTickCount(((int)cc1/0.5)*(-1)+3);
                }
            }
        }
        file.close();
    }
}

4.4 结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45179361/article/details/129836360