Matlab GUI界面设计:从入门到实战

文章目录

Matlab做工程计算和数据分析好用,想给写好的算法套个界面其实也不难。不管是让同学老师用,还是做课设毕设需要交互效果,学会GUI设计都能帮上大忙。很多人不知道从哪下手,其实跟着步骤走,半天就能做出一个能用的界面。这篇文章讲讲Matlab做GUI的两种方式,新手直接看App Designer就行。

选对工具很重要:GUIDE还是App Designer

现在用Matlab做界面,主要就是两个选择。GUIDE是老工具了,用了很多年,网上不少老教程都是讲这个。App Designer是后来出的,设计更合理,用起来也顺手。

新手直接学App Designer,别绕弯子。GUIDE官方都不更了,新项目没必要碰。真哪天碰到老代码要维护,再看也不迟。

10分钟上手App Designer

打开Matlab,顶部工具栏有个"App"标签,点进去选"Design App"就打开了。左边是各种组件,按钮、文本框这些都在这,中间拖放设计,右边改属性。

拖个按钮到中间,右边就能改文字、大小、颜色。双击这个按钮,直接跳去代码区,自动给你生成好点击回调函数的架子,填自己的代码就行。

试一下最简单的,点按钮弹个提示框:

matlab 复制代码
% Button pushed function: HelloButton
function HelloButtonPushed(app, event)
    msgbox('Hello World!');
end

写完点一下工具栏的"Run",界面直接就弹出来了。就是这么快。

常用组件怎么用

做一般的小工具,几个常用组件就够了。

按钮和文本框

按钮肯定用得最多。除了普通按钮,还有开关、单选框、复选框,满足不同选择需求。文本框用来让用户输参数,还能限制只能输数字,超出范围自动提示。

比如做数据拟合工具,让用户输入拟合阶数:

matlab 复制代码
% OrderEditFieldValueChanged function
function OrderEditFieldValueChanged(app, event)
    order = app.OrderEditField.Value;
    if order < 1 || order > 10
        errordlg('阶数请在1-10之间');
    end
end

坐标区显示图形

做数据分析,总得显示图形吧。拖个"UIAxes"组件进去,画图的时候指定一下画到这个坐标区就行。

matlab 复制代码
% PlotButtonPushed function
function PlotButtonPushed(app, event)
    x = linspace(0, 2*pi, 100);
    y = sin(x);
    plot(app.UIAxes, x, y, 'r-', 'LineWidth', 2);
    xlabel(app.UIAxes, 'x');
    ylabel(app.UIAxes, 'y');
end

用法和你平时写的plot基本一样,就多第一个参数指定坐标区。要多个子图,就拖多个UIAxes进去,位置自己调。

下拉菜单给用户选

有几个固定选项让用户挑,用下拉菜单最合适。比如选算法、选数据集之类的场景。

matlab 复制代码
% 下拉菜单选项改变时触发
function AlgorithmDropDownValueChanged(app, event)
    selected = app.AlgorithmDropDown.Value;
    switch selected
        case '最小二乘法'
            % 执行最小二乘法
        case '神经网络'
            % 执行神经网络
    end
end

解决布局乱飘的问题

刚学做GUI,很容易碰到窗口一放大,组件位置全乱了。这个问题App Designer早就想到了,用布局容器就能解决。

网格布局好用

把整个界面分成几行几列,组件放格子里。给每行每列设好权重,窗口放大缩小时,组件自动跟着变大小。

用法很简单:拖个"Grid Layout"进来,属性里设好行数和列数,再把各个组件拖进对应格子就行。

面板给组件分组

功能相关的组件放一块,用面板框起来,用户看着也清楚。参数输入一块,结果显示一块,画图一块,一目了然。

多个回调之间怎么共享数据

做界面总有这个问题:A回调里拿到的数据,B回调要用怎么办?比如用户在文本框输了参数,点按钮要用到这个数。

App Designer的设计很方便,所有数据都存在app对象里。定义个私有属性,哪里都能读能写。

在代码编辑器的"Private Properties"里加上这么一句:

matlab 复制代码
properties (Access = private)
    inputData % 存储输入数据
    result % 存储计算结果
end

之后不管哪个回调函数,直接读直接写:

matlab 复制代码
app.inputData = readmatrix('data.csv');

比GUIDE用全局变量舒服多了,不用怕变量名撞车。

打包成独立EXE

界面做好了,想给没装Matlab的人用?直接打包成独立App就行。

在App Designer点"Share"->"Export as standalone App",跟着向导走就能生成exe。前提是你得装了MATLAB Compiler工具箱。

打出来的包确实有点大,几十兆,因为要把Matlab运行时打包进去。对方不用装Matlab,双击就能跑。

GUIDE简单说两句(维护老代码看这里)

要是你接手老项目,代码用GUIDE写的,大概了解一下就行。GUIDE把界面存在.fig文件,代码存在.m文件,思路也是拖放组件写回调。

命令行输这个就能打开:

matlab 复制代码
guide

但是真不建议做新项目还用这个,功能少,写着也麻烦。

实战:做个简易数据拟合工具

说这么多,不如来个完整例子。我们做个小工具:导入csv数据,选拟合阶数,点按钮出拟合结果图。

界面规划:

  • 最上面:按钮导入文件
  • 中间:左边输阶数,右边拟合按钮
  • 最下面:画图显示结果

核心代码:

matlab 复制代码
% 导入文件按钮
function ImportButtonPushed(app, event)
    [file, path] = uigetfile('*.csv');
    if isequal(file, 0)
        return;
    end
    app.inputData = readmatrix(fullpath(path, file));
    msgbox('导入成功');
end

% 拟合按钮
function FitButtonPushed(app, event)
    if isempty(app.inputData)
        errordlg('请先导入数据');
        return;
    end
    x = app.inputData(:, 1);
    y = app.inputData(:, 2);
    order = app.OrderEditField.Value;
    p = polyfit(x, y, order);
    y_fit = polyval(p, x);

    plot(app.UIAxes, x, y, 'o', x, y_fit, 'r-', 'LineWidth', 2);
    legend(app.UIAxes, '原始数据', '拟合曲线');
end

一百行不到代码,能用的数据拟合工具就出来了。

碰到这些问题怎么办

运行后界面一片空白

八成是你没在App Designer里点Run,直接点开m文件运行了。App Designer生成的文件不能这么跑,要么从设计器启动,要么命令行输app名字运行。

点按钮没反应

看看回调函数生成了没有,名字对不对。App Designer是按命名规则自动绑的,别手贱改函数名,改了就找不到了。

打包失败

先确认你装了MATLAB Compiler,命令行输ver就能看到已装工具箱。没装的话回去补装。

其实Matlab做GUI门槛真不高,拖拖组件写写回调,半天就能搞出一个能用的小工具。比起用Python攒GUI,还要记各个库的API,Matlab快得多,做课设毕设原型特别合适。

。App Designer是按命名规则自动绑的,别手贱改函数名,改了就找不到了。

打包失败

先确认你装了MATLAB Compiler,命令行输ver就能看到已装工具箱。没装的话回去补装。

其实Matlab做GUI门槛真不高,拖拖组件写写回调,半天就能搞出一个能用的小工具。比起用Python攒GUI,还要记各个库的API,Matlab快得多,做课设毕设原型特别合适。

相关推荐
jllllyuz5 小时前
相关干涉仪测向方法的MATLAB仿真
开发语言·matlab
开心码农1号5 小时前
Go 语言深度剖析:指针、unsafe.Pointer 与 uintptr 底层原理、区别与实战避坑
开发语言·后端·golang
manduic5 小时前
凯芯 CSS6404LS-LI 64Mbit QSPI pSRAM 赋能 ESP32 毫米波雷达算法稳定运行与规模化量产
其他
charlie1145141915 小时前
现代Qt开发教程(新手篇)1.10——进程
开发语言·c++·qt·学习
l1t5 小时前
在aarch64机器上安装使用R语言的季节调整包
开发语言·r语言
李威145 小时前
微软VibeVoice 44k⭐:语音AI成新风口
人工智能·microsoft
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题】【Java基础篇】第23题:ConcurrentHashMap的底层原理是什么
java·开发语言·算法·哈希算法·散列表·hash
skywalk81635 小时前
中文编程语法方案对比分析
开发语言
eastyuxiao5 小时前
OpenClaw 全功能说明文档
开发语言·人工智能