matlab设计GUI可视化界面全方位解析 |
您所在的位置:网站首页 › matlabGUI界面超出屏幕了 › matlab设计GUI可视化界面全方位解析 |
如何使用matlab设计GUI及导出
一、GUI的基础知识开始生成GUI界面回调函数Handles结构体GUI中的参数传递
二、控件介绍一、普通按钮二、可编辑文本(edit)和静态文本(text)三、单选框(radiobutton)和复选框(checkbox)四、弹出式菜单(popupmenu)和列表框(listbox)五、坐标区(axes)
三、多个GUI界面的交互一、打开另一个GUI二、GUI件参数的传递
结束语
一、GUI的基础知识
GUI指的是图形化用户界面,广泛用在各种程序的上位机,能够通过简单的操作和按钮就可以调用底层代码,方便我们使用和展示结果。写好了底层的代码后我们就可以制作一个GUI界面来打包和展示。 开始生成GUI界面首先打开matlab,在命令行界面输入guide指令就可以出现以下界面,其中有四个备选项,后三个都是一些模板,大家可以自行尝试,我们主要讲空白操作: 生成的代码看起来复杂,但我们只需要注意除了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结构体Handles结构体包含了gui中所有对象的属性,包括你建立的控件。使用tag属性来索引每个控件,比如handles.edit1指的就是这个可编辑文本框。Handles可以用来值传递,在一个function中将指存入handles,就可以在另一个function中取出这个值。你可以在后文看见很多使用handles进行值传递操作的例子。 GUI中的参数传递在GUI的.m文件中,参数不像一个可执行文件.m一样可以随意传递,因为GUI的.m文件中是以function的形式写的,参数不能在这些function之间随意传递,现总结以下两种方法: 1、使用全局变量 在GUI打开的初始化时,我们定义好全局变量。定义在哪呢?我们刚才提到了初始化.m文件中可编辑的是什么啊?对,就是OpeningFcn和OutputFcn,当我们打开这个fig的时候OpeningFcn中的内容会自动执行,此时我们可以将初始化内容放在这个里面,就比如参数的初始化。 定义全局变量使用global x,要使用到这个变量时,需要在回调函数中再次声明global x才能使用,这件的好处是简单,但是全局变量的缺点就是一处改处处改,变量得不到保护。 2、使用guidata和handles结合的方法 如果在一个控件的回调函数中产生的参数想要传递出去可以这么写,使用这种方法末尾一定要添加guidata(): handles.X=X; handles.Y=Y; guidata(hObject, handles);上述语句将要传出的数据存进了handles结构体中,如果要在另一处调用参数,可以这么写: X1=handles.X; Y1=handles.Y; plot(X1,Y1)handles结构体也包含了gui控件的所有属性,可以调用和修改。 总之,在matlab的gui中进行值传递需要有特殊的操作,以下博客给出了更多的方法:https://www.cnblogs.com/jmliao/p/5628521.html 二、控件介绍选择blank后是如下界面:
这里就使用了set和get函数,使用了handles结构体进行值传递,不需要在文本框的回调函数中写任何内容。
一个被选中时将另一个置零。 给出button回调函数内容: function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) if get(handles.radiobutton1,'value') option=1; elseif get(handles.radiobutton2,'value') option=0; end num1=str2double(get(handles.edit1,'string')); num2=str2double(get(handles.edit2,'string')); if option==0 num=num1+num2; else num=num1*num2; end set(handles.text2,'string',num);结果如下:
要注意我们从菜单中get到的是索引,不是菜单的字符内容。 五、坐标区(axes)接下来我们讲讲坐标区,是一个非常重要的功能,用于画图。我们可以同时在一个界面上插入多个图窗,然后指定我们在哪个图窗里画图。在button的回调函数中我们可以写上之前在其他地方打包好的处理函数,或者定义数据和函数然后画图。这里我演示一个函数绘制工具,在edit框中写入函数,然后选择在哪个框中画出。首先我们设计button回调函数中读取函数名,然后根据单选框状态画出来。 function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) syms x; f=get(handles.edit1,'string'); if get(handles.radiobutton1,'value') axes(handles.axes2) else axes(handles.axes1) end ezplot(f);
有些时候我们要完成的任务不会只在一个GUI中就能解决,这时需要用到多个GUI的合作和数据交互。 一、打开另一个GUI这个功能主要通过run()实现,我这里举一个简单的例子,当我们按下button时,弹出一个确认框。 我们先新建一个GUI界面命名为confirm。在其中新建好静态文本和两个button,右下角的黑点可以调整画布大小,使其满足自己的要求: 看完了上一部分,此时小伙伴们就要问了,我点是或否没有用啊,因为我们没有设置参数的传递,如果此时你新生成的GUI具有独立的功能,那么你完全可以想创建第一个新的那样来写这个GUI,但如果子GUI是一个界面用于设置父GUI需要的各种参数的话,那你就麻烦了。此时两个GUI产生了交互,那我们应该怎么设置呢? 我们加大上个问题的难度,先读取父GUI中的分数,然后在子GUI显示,确认后送回父GUI中显示确认的结果。 当我们在父GUI中按下button时,需要读取文本框中分数的大小,我们先在button的回调函数中写score=get(handles.edit1,'string');用于读取分数并存放在score中,此时我们需要把这个score送入我们的comfirmGUI中,使用out = comfirm(score) 注意此处的out是从子GUI中得到的返回值,score是形参,comfirm换成你自己的子GUI名。所以在button的回调中这么写: function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) score=get(handles.edit1,'string'); out = comfirm(score) ; if out==1 set(handles.text2,'string',"已确认"); else set(handles.text2,'string',"已否认") end现在我们关注子GUI写法。我们在父GUI中调用了comfirmGUI,此时按下button就会弹出子GUI,我之前讲了,一个GUI的初始化工作是在OpeningFcn中执行的,我们在这个地方取出父GUI传来的分数,handles.in1 = varargin{1};注意,这个varargin和即将出现的varargout是两个大小可变的数组,用来传送输入和输出。所以在子GUI的OpeningFcn中这么写: function comfirm_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to comfirm (see VARARGIN) handles.in1 = varargin{1}; set(handles.text3,'string',['确认分数是',handles.in1,'吗?']); % Choose default command line output for comfirm % Update handles structure guidata(hObject, handles); uiwait(handles.figure1)思路是我们得到了varargin传来的数据也就是分数后,显示出来。强调!我在第一部分的时候讲过了,OpeningFcn和OutputFcn是按顺序执行的!我们必须在末尾加上uiwait(handles.figure1)figure1是子GUI的tags,检查器中可以找到。这个语句会让程序停下不再执行OutputFcn,否则一开始输出就确定了那就不需要白费力气了。 接下来我们看button的回调函数,这个很简单: function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) handles.out1=1; guidata(hObject, handles); uiresume(handles.figure1)如果是被按下,则返回1并用handles传出。在button回调函数的结尾必须加上uiresume(handles.figure1)这样才能继续回到我们刚才uiwait的地方继续执行OutputFcn,我们看看它的内容: function varargout = comfirm_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.out1; delete(handles.figure1);varargout是用于将子GUI内的数据传出的载体,之前已经讲过了与之相对的varargin,就不再多说了。在最后我们要加上delete(handles.figure1);表示执行到这个地方关闭子GUI,其中figure1是子GUI的tags。到这个地方我们就回到了父GUI并得到了下图: 笔者水平有限,简单地介绍了一下matlab中GUI的各种操作,这些就像是积木一样,了解了最基本的自己通过学习和努力慢慢搭建高楼大厦就可以了。如有错误,欢迎大家指出。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |