GUI指的是图形化用户界面,广泛用在各种程序的上位机,能够通过简单的操作和按钮就可以调用底层代码,方便我们使用和展示结果。写好了底层的代码后我们就可以制作一个GUI界面来打包和展示。
生成的代码看起来复杂,但我们只需要注意除了OpeningFcn和OutputFcn其他地方都不要修改就行了。注意,这两个函数在GUI产生的时候会先按顺序执行一遍,然后在检查你是否对控件有操作上述的两个函数是回调函数,那么回调函数是什么意思呢?
简单介绍,在GUI设计中回调函数就是我们在界面上进行相关操作后需要执行的函数。matlab中的回调函数分为五种:
1、Callback
这是最常用的回调函数,比如一个普通按钮,当你按下时,就会调用Callback函数执行,一个文本框,当你输入内容时,就可以执行Callback中的内容,比如要检查内容是否符合格式等等。总之,对一个控件执行默认的操作,Callback就会执行。实现功能,主要就是写在Callback下,当按下这个按钮时我们就可以使matlab开始某种计算然后画图。
2、CreateFcn
在显示某个控件之前执行里面的代码,比如某个控件要有先行条件,我们可以在这里面准备好。这个回调较少使用,我也没用过。
3、DeleteFcn
在使某个控件消失或关闭之前执行的代码,比如关闭时的自动保存,关闭时的确认是否关闭,都可以放在这里面。
4、ButtonDowmFcn
指的是鼠标在这上面点一下后执行的代码。对一个普通按钮就只能按下,Callback会覆盖掉这个函数的内容。对其他的控件,这个回调很多时候也起辅助作用,毕竟对一个可编辑文本框,你点他干啥,文本框就是拿来输入内容的。
5、KeyPressFcn
当某个控件被选中获得焦点时执行的代码。什么是焦点,比如你打开两个word,你输入的字只会出现在一个word上,因为此时的焦点在这个word上。
Handles结构体包含了gui中所有对象的属性,包括你建立的控件。使用tag属性来索引每个控件,比如指的就是这个可编辑文本框。Handles可以用来值传递,在一个function中将指存入handles,就可以在另一个function中取出这个值。你可以在后文看见很多使用handles进行值传递操作的例子。
在GUI的.m文件中,参数不像一个可执行文件.m一样可以随意传递,因为GUI的.m文件中是以function的形式写的,参数不能在这些function之间随意传递,现总结以下两种方法:
1、使用全局变量
在GUI打开的初始化时,我们定义好全局变量。定义在哪呢?我们刚才提到了初始化.m文件中可编辑的是什么啊?对,就是OpeningFcn和OutputFcn,当我们打开这个fig的时候OpeningFcn中的内容会自动执行,此时我们可以将初始化内容放在这个里面,就比如参数的初始化。
定义全局变量使用,要使用到这个变量时,需要在回调函数中再次声明才能使用,这件的好处是简单,但是全局变量的缺点就是一处改处处改,变量得不到保护。
2、使用guidata和handles结合的方法
如果在一个控件的回调函数中产生的参数想要传递出去可以这么写,使用这种方法末尾一定要添加guidata():
上述语句将要传出的数据存进了handles结构体中,如果要在另一处调用参数,可以这么写:
handles结构体也包含了gui控件的所有属性,可以调用和修改。
总之,在matlab的gui中进行值传递需要有特殊的操作,以下博客给出了更多的方法:https://www.cnblogs.com/jmliao/p/5628521.html
一个被选中时将另一个置零。
给出button回调函数内容:
要注意我们从菜单中get到的是索引,不是菜单的字符内容。
接下来我们讲讲坐标区,是一个非常重要的功能,用于画图。我们可以同时在一个界面上插入多个图窗,然后指定我们在哪个图窗里画图。在button的回调函数中我们可以写上之前在其他地方打包好的处理函数,或者定义数据和函数然后画图。这里我演示一个函数绘制工具,在edit框中写入函数,然后选择在哪个框中画出。首先我们设计button回调函数中读取函数名,然后根据单选框状态画出来。
有些时候我们要完成的任务不会只在一个GUI中就能解决,这时需要用到多个GUI的合作和数据交互。
看完了上一部分,此时小伙伴们就要问了,我点是或否没有用啊,因为我们没有设置参数的传递,如果此时你新生成的GUI具有独立的功能,那么你完全可以想创建第一个新的那样来写这个GUI,但如果子GUI是一个界面用于设置父GUI需要的各种参数的话,那你就麻烦了。此时两个GUI产生了交互,那我们应该怎么设置呢?
我们加大上个问题的难度,先读取父GUI中的分数,然后在子GUI显示,确认后送回父GUI中显示确认的结果。
当我们在父GUI中按下button时,需要读取文本框中分数的大小,我们先在button的回调函数中写用于读取分数并存放在score中,此时我们需要把这个score送入我们的comfirmGUI中,使用 注意此处的out是从子GUI中得到的返回值,score是形参,comfirm换成你自己的子GUI名。所以在button的回调中这么写:
现在我们关注子GUI写法。我们在父GUI中调用了comfirmGUI,此时按下button就会弹出子GUI,我之前讲了,一个GUI的初始化工作是在OpeningFcn中执行的,我们在这个地方取出父GUI传来的分数,注意,这个varargin和即将出现的varargout是两个大小可变的数组,用来传送输入和输出。所以在子GUI的OpeningFcn中这么写:
思路是我们得到了varargin传来的数据也就是分数后,显示出来。强调!我在第一部分的时候讲过了,OpeningFcn和OutputFcn是按顺序执行的!我们必须在末尾加上figure1是子GUI的tags,检查器中可以找到。这个语句会让程序停下不再执行OutputFcn,否则一开始输出就确定了那就不需要白费力气了。
接下来我们看button的回调函数,这个很简单:
如果是被按下,则返回1并用handles传出。在button回调函数的结尾必须加上这样才能继续回到我们刚才的地方继续执行OutputFcn,我们看看它的内容: