草庐IT

MATLAB(6)GUI应用介绍

凯之~ 2023-05-03 原文

目录

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); 

       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. 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. 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); 

对应的,设置整个文件的函数都能用的变量可以用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);  %上一行的...为续航符

       至于获取当前用户选中的选项,当然就是通过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);

附录

各文件共享数据

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

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

保存

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

获取

%同上,取出上次存储的值
val=getappdata(obj,name);

有关MATLAB(6)GUI应用介绍的更多相关文章

  1. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  4. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  5. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  6. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  9. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  10. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

随机推荐