一. 内容简介
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 结果展示