QT与MATLAB混合编程详解

写在前面:由于matlab和qt的环境配置复杂,请大家一定先根据自己电脑的路径来替换本文中的路径

本文使用环境:

        MATLAB 2022b

        qt 6.6

        编译环境:MSVC2019 64位

matlab的环境还需要配置在环境变量中

此电脑(右键)—>属性—>高级系统设置—>环境变量—>环境变量—>path,加入下面:

这里要填自己matlab的路径哦!应用完之后,需要重启电脑使其生效

检查matlab的环境

mbuild -setup

正常会输出以下结果,请大家选择红圈内的选项

在matlab下新建一个文件,我们写一个绘制三角函数的代码,写入以下代码:

function y = mysin( )
% 定义 x 的范围  
x = -2*pi:0.01:2*pi;  
  
% 计算 sin(x)  
y = sin(x);  
  
% 添加标题和标签  
title('sin(x) 函数');  
xlabel('x');  
ylabel('sin(x)');

% 绘制 sin(x) 函数  
plot(x, y);  

end

注意,需要写成函数形式

运行一下

在matlab的命令行下输入下面的代码

mcc -W lib:mysindll -T link:lib mysin.m -C

我们主要用的是下面的四个文件:

 

然后我们来创建qt项目

 之后的选项默认,然后我们来到选择构建套件这一步

我们选择MSVC 2019 64 

创建项目后,我们需要先运行一下、

我们需要把下面三个文件,放到项目目录下

然后把下面这个文件,放到debug目录下

然后右击头文件,添加现有文件, 选中.h文件

然后我们来修改.pro文件,在其中添加以下内容:

INCLUDEPATH +=D:\matlab\extern\include\
              D:\matlab\extern\include\win64
DEPENDPATH += D:\matlab\extern\include
LIBS += D:\matlab\extern\lib\win64\microsoft\libmx.lib\
        D:\matlab\extern\lib\win64\microsoft\mclmcr.lib\
        D:\matlab\extern\lib\win64\microsoft\mclmcrrt.lib\
        D:\matlab\extern\lib\win64\microsoft\libmat.lib\
        D:\matlab\extern\lib\win64\microsoft\libmex.lib\
        D:\matlab\extern\lib\win64\microsoft\libeng.lib\

INCLUDEPATH += $$PWD/''
DEPENDPATH += $$PWD/''

这里的路径需要改为自己matlab的路径

这里我们手动添加库,将下面红圈的内容改成自己的路径

在mainwindow.ui下添加两个按钮

 

在mainwindow.h里,声明两个函数

这是我的mainwindow.cpp,大家可以根据自己的需求修改

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <mclmcrrt.h>
#include "mysindll.h"
#include <QMessageBox>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        func1();
    });
    connect(ui->pushButton_2,&QPushButton::clicked,[=](){
        func2();
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::func1()
{
    if(mysindllInitialize())
    {
        QMessageBox::information(NULL,"ok","初始化成功");
    }else{
        QMessageBox::information(NULL,"NO","初始化失败");
    }

    mlfMysin(1,NULL);

}

void MainWindow::func2()
{
    mysindllTerminate();
}

运行结果如下:

下面对于几个可能的报错进行解释:

缺少dll文件,需要把生成的dll文件放到debug目录下

函数绘制结果不正确:需要把.ctf文件也放到项目目录下