QT和matlab混合编程以及maltab程序化初始化失败_qt matlab-程序员宅基地

技术标签: QT  qt  开发语言  

一. 内容简介

需要用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/microsoft

win32: 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+B
      
      result=c.ToString();
      ui->lineEdit_3->setText(result);

copy别人的,当注释用


    double   vectA[]={
    1,2,3}; //向量A
    double   vectB[]={
    5,6,7};  //向量B

    int   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 111.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();
}

五.参考

QT和matlab混合编程实现加法运算http://t.csdn.cn/TCfz4
Qt生成的exe文件打包给其他人使用http://t.csdn.cn/7GZOC
Qt 5.9 与 Matlab 2017b 混合编程基本流程http://t.csdn.cn/QhcyO
Qt设置软件启动动画(开屏动画、欢迎界面)http://t.csdn.cn/nvw0h
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45179361/article/details/128098901

智能推荐

[微服务]API网关(API Gateway)_implementation and performance analysis of api gat-程序员宅基地

文章浏览阅读1.5k次。工作中使用了微服务架构,接下来的一段时间里,我会写一系列的文章来介绍微服务架构,同时我也会在github上写一个microservices的应用框架(地址会在后续文章给出)。这篇文章主要讲述了微服务架构中的API Gateway。 翻译和整理自: http://microservices.io/patterns/apigateway.html 一、问题 微服务架构..._implementation and performance analysis of api gateway for microservices arc

30分钟简易复刻元气骑士地图生成系统_scratch做元气骑士地图-程序员宅基地

文章浏览阅读4.7k次,点赞8次,收藏58次。本文转自Unity Connect博主 超级汽水一个简易的房间类 Roguelike 游戏地图生成系统如果你还不知道《元气骑士》是什么游戏,也许你可以去看看这个视频https://space.bilibili.com/87721937地图显示方式随机大小的矩形房间。随机的房间数量。通过走廊连接每个房间。每个图都有 俩个特殊房间:“出生房”、“传送房”。地图生成思路梳理因为..._scratch做元气骑士地图

南邮23考研复试上机[1015小明与选择题]_南京邮电小明与选择题-程序员宅基地

文章浏览阅读323次。全力以“复”,力争上“邮”~_南京邮电小明与选择题

鼠标聚焦到Text输入框时,按回车键刷新页面原因及解决方法-程序员宅基地

文章浏览阅读87次。前提 一个form中只有一个输入框,当输入框获取焦点后,点击回车,导致整个页面都刷新,问题解决办法。1、处理form在form中添加事件<formonsubmit="return false;">.......</form>2、增加一个隐藏的输入框,认为改变单个输入框<inputid="hiddenText"..._js 焦点在文本框按enter键刷新数据

C#实现MJPEG服务器-程序员宅基地

文章浏览阅读357次。实现流写入,将图像作为mjpeg写入 public class MjpegWriter : IDisposable { private static byte[] CRLF = new byte[] { 13, 10 }; private static byte[] EmptyLine = new byte[] { 13, 10, 13, ..._c# mpeg server

数据源初始化错误:ClassNotFoundException: com.alibaba.druid.pool.DruidDataSourceFactory的解决_caused by java.lang.classnotfoundexception: com.al-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏3次。Exceptionsendingcontextinitializedeventtolistenerinstanceofclassorg.springframework.web.context.ContextLoaderListenerorg.springframework.beans.factory.BeanCreationException:Errorcreating..._caused by java.lang.classnotfoundexception: com.alibaba.druid.pool.druiddata

随便推点

npm EPERM: operation not permitted, rename解决-程序员宅基地

文章浏览阅读9.7k次,点赞3次,收藏6次。此问题并非权限问题!执行如下3条命令解决:1.清理npm缓存npm cache clean --force2.升级npm版本npm install -g npm@latest --force3.再次清理npm缓存npm cache clean --force  然后再次运行npm install 即可。转载于:https:/..._npm err! error: eperm: operation not permitted, rename

qt 启动参数 -qws-程序员宅基地

文章浏览阅读262次。运行嵌入式程序在嵌入式QT版本中,程序需要服务器或自己作为服务器程序。服务器程序构造的方法是构造一个QApplication::GuiServe类型的QApplication对象。或者使用-qws命令选项启动程序。Using a Single Display使用-qws选项using Mutiple Displays嵌入式版本中运行多个县市同时运行。两种方式可以实现,要么多次运行服务程序,要么..._qt设置启动参数

【机器学习】朴素贝叶斯算法-程序员宅基地

文章浏览阅读1.4w次,点赞22次,收藏147次。朴素贝叶斯(Naive Bayes)是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。由于朴素贝叶斯计算联合概率,所以朴素贝叶斯模型属于生成式模型。经典应用案例包括:文本分类、垃圾邮件过滤等。_朴素贝叶斯算法

APT攻击分析-程序员宅基地

文章浏览阅读638次。2019独角兽企业重金招聘Python工程师标准>>> ..._apt - ghostrat - tcp - variant 4

网站使用mysql_使用网站的mysql-程序员宅基地

文章浏览阅读92次。{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行数据压测演练,提供数据库优化方面专业建议,在业务高峰期与用户共同保障数据库系统平..._mysql对于网站

YOLOv7训练自己的数据集(超详细)-程序员宅基地

文章浏览阅读6.4w次,点赞74次,收藏808次。YOLOv7训练自己的数据集(超详细)_yolov7训练自己的数据集