一. 内容简介
需要用QT调用matlab代码完成计算,并获取计算结果。
二. 软件环境
2.1QT 5.14.1
新版QT6.4,,6.5在线安装经常失败,而5.9版本又无法编译64位程序,所以就采用5.14.1这个用的比较多也比较稳定的一个版本。
QT编译器采用的是MSVC2017 64bit。
链接:https://pan.baidu.com/s/1ER98DPAkTUPlIyCC6osNNQ?pwd=1234
2.2MatlabR2022b(64位)
2.3Visual studio 2017
Visual stdio采用2017主要是因为QT5.14.1最高到MSVC2017 64bit。
三.主要流程
3.1将.m文件打包成c++动态库dll
3.2QT导入lib库,设置系统环境变量,加入Matlab其他依赖库和头文件搜索路径
3.3QT调用DLL中的函数
3.4对QT编译后的exe进行打包,以及增加启动页面
四.具体步骤
4.1将.m文件打包成c++动态库dll
在matlab中编写matAdd.m。
function [C]= matAdd(A,B)
C=A+B;
end
在命令行中输入
mbuild -setup
选择mex -setup C++ -client MBUILD
再输入
mbuild -setup C++
随后
选择
点击打包即可
4.2QT导入lib库,设置系统环境变量,加入Matlab其他依赖库和头文件搜索路径
导入lib库
在pro文件中,加入Matlab其他依赖库和头文件搜索路径
# .h文件搜索路径INCLUDEPATH += D:/MATLAB/R2022b/extern/include
INCLUDEPATH += D:/MATLAB/R2022b/extern/include/Win64# 用到的MATLAB 的.lib库文件 及其搜索路径
INCLUDEPATH += D:/MATLAB/R2022b/extern/lib/win64/microsoft
DEPENDPATH += D:/MATLAB/R2022b/extern/lib/win64/microsoftwin32: LIBS += -LD:/MATLAB/R2022b/extern/lib/win64/microsoft/ -llibmex
win32: LIBS += -LD:/MATLAB/R2022b/extern/lib/win64/microsoft/ -llibmx
win32: LIBS += -LD:/MATLAB/R2022b/extern/lib/win64/microsoft/ -llibmat
win32: LIBS += -LD:/MATLAB/R2022b/extern/lib/win64/microsoft/ -llibeng
win32: LIBS += -LD:/MATLAB/R2022b/extern/lib/win64/microsoft/ -lmclmcr
win32: LIBS += -LD:/MATLAB/R2022b/extern/lib/win64/microsoft/ -lmclmcrrt
系统环境变量的设置
D:\MATLAB\R2022b\runtime\win64;
D:\MATLAB\R2022b\bin\win64;
4.3QT调用DLL中的函数
一般我都把这个初始化放在main.cpp中,做一个启动页面,然后把这个matlab初始化放在启动页面中(可以看下我的启动页面的文章https://blog.csdn.net/qq_45179361/article/details/128984660),直接用的话加载会卡几秒(视电脑性能而定),把初始化和计算分离最好了。
下面说问题,就是这个初始化会失败,为什么失败我也不确定,我确定不了之前我有没有配环境,但是之前一直能用的,后来换了一个程序就一直初始化失败,第一步先检查代码,代码没问题后,第二步就安装环境,调用新的程序都需要安装的(不同程序的环境不一样,不通用)。
然后第一步就安装环境(复杂一些的就需要了,别的电脑用的话也需要),安装完了在调用,这样保险一些,具体不装能不能用我也不清楚,没测试了,但是好几次都是装完就好了
if (!matAddInitialize()) //DLL 初始化
{ui->lineEdit_3->setText("DLL initialization failed");return;
}
环境安装,就前面编译完事后生成的三个文件夹
第二个是咋们用的库了什么的,第一个是这个matlab程序执行需要的环境,这个要安装的
安装好了,就可以发现初始化成功了,我之前一直怀疑是代码的问题,
上边的是后来又补的,下边是原来的
如果matAddInitialize标红的话,还要将头文件引入,下边的代码是写在.cpp文件中的。
if (!matAddInitialize()) //DLL 初始化{ui->lineEdit_3->setText("DLL initialization failed");return;}QString result;double para1,para2;para1=ui->lineEdit->text().toDouble();para2=ui->lineEdit_2->text().toDouble();mwArray a(1,1,mxDOUBLE_CLASS);mwArray b(1,1,mxDOUBLE_CLASS);mwArray c(1,1,mxDOUBLE_CLASS);a(1,1)=para1;b(1,1)=para2;int nargout=1;//输出变量个数matAdd(nargout,c,a,b);//C=A+Bresult=c.ToString();ui->lineEdit_3->setText(result);
copy别人的,当注释用
double vectA[]={1,2,3}; //向量Adouble vectB[]={5,6,7}; //向量Bint rowCnt=1; //行数int colCnt=3; //列数int elementCnt=3; //元素个数mwArray matrixA(rowCnt,colCnt,mxDOUBLE_CLASS, mxREAL);//定义数组matrixA.SetData(vectA,elementCnt); //将C++ 的一维数组存储到 MATLAB的二维数组mwArray matrixB(rowCnt,colCnt,mxDOUBLE_CLASS, mxREAL);//定义数组matrixB.SetData(vectB,elementCnt); ////计算mwArray matrixp(73,73,mxDOUBLE_CLASS, mxREAL);//定义数组,double类型mwArray matrixh(73,73,mxDOUBLE_CLASS, mxREAL);//定义数组,double类型int nargout=2;//输出变量个数matAdd(nargout,matrixp,matrixh,matrixA,matrixB);//C=A+B//读取结果int dim=2; //按照二维数组读出matrixC
4.4对QT编译后的exe进行打包,以及增加启动页面
使用realease编译,将realease文件中的exe移动到新的文件夹中,随后搜索qt
接下来cd 到我们exe所在的文件的路径中
cd /d C:\Users\Lenovo\Desktop\matlab
再输入,windeployqt 1.exe,即可完成打包。
windeployqt 1.exe
QT调用matlab,第一次运行会加载几秒钟,所以在软件启动时完成第一次加载,随后速度就正常了,可以增加一个几秒的启动页面
#include <QDateTime> /
#include <QWidget>
#include "matAdd.h"
#include <QApplication>
#include<QPixmap>
#include<QSplashScreen>
#include <windows.h>
#include <QtTest/QTest>int main(int argc, char *argv[])
{QApplication a(argc, argv);QPixmap lodingPix("Qt.png");QSplashScreen splash(lodingPix);splash.show();splash.showMessage("程序正在加载......", Qt::AlignTop|Qt::AlignRight, Qt::red);a.processEvents();Sleep(5000);Widget w;w.show();splash.finish(&w);return a.exec();
}