• MATLAB(6)GUI应用介绍


    GUI编辑器

           MATLAB的GUI编辑器在命令行窗口输入“guide”启动,选择模板并点击确定后创建对应的.fig文件和.m文件。创建完成后如下图所示,左侧为各类控件,右上角为完成后运行GUI。控件的属性、.m文件为函数文件,存放各个控件的相应回调函数。将左侧控件左键单击拖动即可进行摆放。此时右键单击控件即可操作控件的属性、回调函数等。

    在这里插入图片描述

    控件

           控件是GUI最基本的组成部分,不同控件组成的UI界面可用于交互,用户对UI界面中控件的动作,比如按下按钮,向编辑栏输入数据等,则会调用相应的回调函数,执行预先设定好的命令,进而实现交互。

           MATLAB的GUIDE中包含常见的按钮、可编辑文本等常见的控件,基本上可以满足用户对UI的设计,并且还增加了ActiveX控件(对ActiveX控件暂时不太明白怎么用)。

    属性

           控件属性决定了控件的颜色、大小、显示内容等,某些控件可能会有特有的属性,控件的属性可以通过双击控件以弹出该控件的属性检查器或右键点击控件后选择“属性检查器”(UI界面可以通过双击空白区域或右键点击空白区域),左栏为属性名称,右栏为属性值。下面介绍控件常见的属性:

    1. Enable
      该属性的值与对应描述如下表所示。
    属性值描述
    on控件正常显示,可正常使用
    off控件变暗,不可使用
    inactive控件正常显示,但不可使用
    1. String
      控件显示的文本,对可编辑文本、列表框等控件比较重要。

    2. Tag
      控件特定的标签,每个控件的属性Tag的值不同,通过代码完成控件属性值的设置或读取需要通过该属性。

           控件的属性除了在设计UI界面时设置外,在代码中也可以进行属性值设置与读取,分别通过set和get函数完成,两个函数示例如下所示。

    get(handles.edit_mod_id, 'String');       %注意属性String通过单引号'括起
    set(handles.edit_mod_id, 'String', Str); 
    
    • 1
    • 2

           get函数用于读取相应属性的值,第1个参数用于选定控件,第2个参数指定需要读出值的属性,该函数的返回值即为相应属性的值(需要注意的是返回值类型不一,可查看MATLAB属性介绍)。

    第1个参数格式为UI界面句柄.控件标签,UI界面句柄一般为handles,一般为回调函数的第3个参数,控件标签即为上述的Tag属性值。

           set函数用于设置相应属性的值,第1个参数用于选定控件,第2个参数指定属性,第3个参数为写入值。

    在属性检查器,右键相应属性名称,再点击弹窗,即可查看MATLAB对该属性的介绍。

    回调函数

           控件回调函数,即用户对控件进行相应操作后,后台执行的函数,不同控件具有的回调函数不同,并且除了控件外,UI界面同样有其回调函数,通过选中控件 → 右键点击 → 查看回调,再点击相应回调函数,即可在.fig文件对应的.m文件中生成相应控件的回调函数(UI界面的回调函数生成类似,通过点击空白处以选中界面)。下面介绍一下常用的回调函数(部分控件会有特有的回调函数):

    1. CallBack
          最常用的回调函数,控件进行默认操作时被调用,默认操作例如按钮按下、复选框选中、滑动条滑动等。

    2. ButtonDownFcn
          鼠标右键点击控件时被调用。

    3. CreateFcn
          在生成这个控件时被调用,该回调函数不止控件具有,整个界面同样存在,当然,整个界面的CreateFcn函数可以用对应.m文件的第2个函数xx_OpeningFcn代替,可用于界面创建后初始化相应全局变量。

    4. DeleteFcn
          类似CreateFcn,在控件被销毁(一般是整个界面被关闭时被调用)。

    5. KeyPressFcn
          当控件被选中(获得焦点)并且有按键按下时,该函数被调用,例如可编辑文本,通过键盘向其输入时会调用该函数(使用输入法输入的话好像没有调用)。

    获得焦点,或者说被选中有1个很好的例子,比如打开1个记事本,在点击1个网页,此时点击键盘,输入的内容不会出现在记事本中。

    MATLAB常见的控件

    控件”面板“、”静态文本“无需回调函数或特殊属性,存在的作用就是单纯的显示(当然实在想加也可以加创建、销毁回调),在此不多介绍。

    普通按钮

    在这里插入图片描述

           控件“普通按钮”实际上就是1个按钮,通过鼠标左键单击时调用 Callback 函数,右键单击时调用 ButtonDownFcn 函数。

    注意,”KeyPressFcn“这种回调函数虽然“普通按钮”这种控件也可以使用,但这个Press是指键盘按键按下,而上面两个函数是在UI界面中点击按钮。

    切换按钮

    在这里插入图片描述

           相比于“普通按钮”,控件“切换按钮”不会自动弹起,即点击之后会固定显示,再次点击才会恢复,与属性‘Value’的值有关,未按下时‘Value’对应属性‘Min’的值,为0。按下后变灰,‘Value’对应属性‘Max’的值,为1。

           同样的,“切换按钮”和”普通按钮“一样有callback和ButtonDownFcn两种回调函数,效果一致,左键单击调用callback函数时,自动切换属性’Value‘的值,同时切换按钮状态(每次切换状态都会调用callback),而右键单击则调用ButtonDownFcn函数,但仅此而已,不会修改属性’Value‘的值,以及切换按钮状态。

    可编辑文本

           控件“可编辑文本”具有5种回调函数,但一般都不会使用,作为可编辑文本一般有两种用法:获取输入的字符、显示字符,这两者分别通过get函数和set函数操作String属性即可。

           从左侧拖动放置的“可编辑文本”,一般只有单行显示,而且固定上下居中,输入大量数据时多余数据会消失在左侧,如下图所示。

    在这里插入图片描述
           若需要多行显示,可以将“可编辑文本”的属性”Max“设置为大于1的值,此时“可编辑文本”显示的数据会到最上面,并且会自动换行、添加1个滑动条,如下图所示。

    在这里插入图片描述

    如果需要可编辑文本中的文本左对齐的话,设置属性‘HorizontalAlignment’为left即可,运行时文本会自动向左上角对齐。

    字符获取

           字符获取的意思是获取输入框的内容,相关属性为‘String’,一般使用get函数,代码如下所示,edit_mod_id为输入框空间的属性‘Tag’的值,通过该函数返回1个字符串数组(不是因为后面的’String’!)。

    get(handles.edit_mod_id, 'String');
    
    • 1

           由于获取的是字符串,因此一般需要进行转化:

    1. hex2dec(hex_str):将十六进制字符串hex_str转为十进制数,'12’变为18。
    2. char(num):将对应十进制数字num转为对应Unicode的字符,56变为’8‘。

    注意,MATLAB的十六进制只能以字符串形式表示。

    字符显示

           字符显示指将字符串显示在输入框中,相关属性为‘String’,一般使用set函数,代码如下所示,str为字符串变量。

    set(handles.edit_mod_id, 'String', Str); 
    
    • 1

           由于参数是字符串,因此一般需要进行转化:

    1. sprintf(‘%c’,num):将十进制数字转化为对应Unicode的字符,单引号内为%c时等效于char(num)
    2. num2str(num):将十进制数字转化为对应的字符串。123变为‘123’

           注意上面的字符显示函数为set,所以是设置字符串而不是添加字符串,添加字符串可以尝试下面的代码:

    persistent str;                %设置str为静态变量,persistent作用和C语言的static类似
    str=[str, '添加的字符串'];     %合并
    set(handles.edit_mod_id, 'String', str); 
    
    • 1
    • 2
    • 3

    对应的,设置整个文件的函数都能用的变量可以用global,在每个需要用到该变量的函数都用global进行定义即可(此时只有第1次使用是定义,后面起始都是声明)。

    复选框

    在这里插入图片描述

           控件”复选框“重点的属性为’Value‘,代表是否被勾选,当’Value‘的值等于属性’Max‘的值时,显示被勾选。等于属性’Min‘的值时,显示不被勾选。因此同样可以通过get和set获取或设置复选框的状态。

    当’Value‘的值既不等于’Max‘,也不等于’Min‘时,复选框不可见。

    单选按钮

    在这里插入图片描述

           控件”单选按钮“用于让用户在多个选项中选择1种。必须与‘按钮组’组合,否则作用和复选框没区别,将其放在控件”按钮组“内后,有且只有一个”单选按钮“会被选中(如果不在”按钮组“内则无该约束)。同样,单选按钮重点的属性为’Value‘,代表是否被选中,当’Value‘的值等于属性’Max‘的值时,显示被选中。等于属性’Min‘的值时,显示不被选中。

    弹出式菜单

    在这里插入图片描述

           控件”弹出式菜单“重点的属性在于’String‘和’Value‘,前者决定弹出可选的内容(也就是上面的选项1、2、3…),后者决定目前选中的内容(如上,此时选项5,则’Value‘的值为5)。设置代码参考如下,此时弹出相应选项,并且当前选中选项5。一般可以在界面打开时调用该段代码,也就是xx.fig对应的xx.m的第2个函数,末尾为’_OpeningFcn‘的函数中调用。

    set(handles.popupmenu1, 'string', {'选项1', '选项2', '选项3', '选项4', '选项5',...
        '选项6', '选项7', '选项8'}, 'value', 5);  %上一行的...为续航符
    
    • 1
    • 2

           至于获取当前用户选中的选项,当然就是通过get函数获取属性’Value‘的值咯。

    滑动条

    在这里插入图片描述

           控件”滑动条“好像一般不会使用到,毕竟最需要的可编辑文本已经自带了。滑动条重点的属性在于’Value‘,其范围为属性’Min‘至’Max‘之间,滑动会使得属性’Value‘的值变化,在代码中可以通过set函数获取滑动条的值。

           值得一提的是滑动条的回调函数callback,拖动滑动条然后停止,callback函数会在停止时被调用,也就是说可以在这时获取属性’Value‘的值。

    列表框

    在这里插入图片描述

           控件”列表框“用于列举选项,给用户提供一种选择,重点的属性在于’String‘和’Value‘,’String‘属性为列表框中的内容,如果需要通过set和get函数操作,需要注意操作的是元胞数组,每个元胞都是一项内容。’Value‘属性为当前被选中的内容,从1开始。

    ”列表框“和”弹出式菜单“这两种控件在作用上十分相似,不过前者占用空间比较大,虽然有滑动条,但也不太方便。

    在这里插入图片描述

           控件”表“的重点属性为‘Data’,顾名思义就是表格内的数据,通过get和set函数可对其进行操作,注意操作的是元胞数组(该元胞数组是整个表格的内容),每个单元格的内容又是一个元胞数组,而这个元胞数组内,包含1个字符数组,也就是单元格的内容。

           在GUIDE中,可以通过属性检查器进行表头设置,如下图所示,点击该图标后在弹出窗口的左侧可分别设置行、列的表头, 在列属性的设置中,还可以选择该列的单元格是否允许编辑(表的内容默认是不可编辑的)。

    在这里插入图片描述

           表的回调函数包括CellSelectionCallback、CellEditCallback,当某个单元格被选中时调用CellSelectionCallback函数,当编辑完成(编辑后选择其它单元格或点击Enter)后调用CellEditCallback函数。

    坐标区

    在这里插入图片描述
           控件”坐标区“用于绘图,绘图相应的知识点可以参考MATLAB绘图一文,”坐标区“的重点属性为‘XTick’和‘YTick’,表示”坐标区“横纵轴显示的数目(如上图所示,‘XTick’值为[1x3 double array]因此显示3个数,‘YTick’为[1x6 double array]因此显示6个数)。

    注意,坐标轴的范围只与绘制曲线的值有关,即MATLAB会自动进行相应调整。

           在控件”坐标区“上绘图,使用的函数同样是plot函数,当然第1个参数应选中”坐标区“这个控件,如下所示。

    plot(handles.axes1, xLeft, yLeft, xRight, yRight);
    
    • 1

    附录

    各文件共享数据

    建议各文件共享数据使用global修饰需要共享的变量,在使用的函数内使用global,运行第1次时会进行定义,后面都是声明,指向同一个变量。

           通过setappdata和getappdata可将某个数据在各个m文件中传递:

    保存

    %obj为对象,UI对象的话可以查看fig文件里面各个函数第一个参数,一般好像是hObject
    %name为字符串,可随意定义
    %val为存储的值
    setappdata(obj,name,val) 存储 val 的内容
    
    • 1
    • 2
    • 3
    • 4

    获取

    %同上,取出上次存储的值
    val=getappdata(obj,name);
    
    • 1
    • 2
  • 相关阅读:
    P5488 差分与前缀和
    nodejs+express重定向
    K1.Compound interest basics(每天进步一点点)
    万物互联时代到来,猿代码领衔先计算机赋数据化转型
    将本地项目上传至Github详解
    小文件写入性能 5 倍于 S3FS,JuiceFS 加速生信研究
    spring boot项目运行jar包读取包内resources目录下的文件
    18数据接口和selenium
    csblog: 一站式秃头孵化基地
    基于SpringBoot的企业部门与员工管理系统,毕设、课设资源包,附送项目源码和数据库脚本
  • 原文地址:https://blog.csdn.net/weixin_47447179/article/details/126040515