前言
本篇博客主要对博主自己在做毕设 GUI 设计时遇到的一些细节问题进行总结纪录,点击下面目录中的相关问题,可以直接跳转至相应位置。另外,需要声明的是,我所使用的MATLAB版本——MATLAB R2016a。
一、使用MATLAB的GUIDE开发环境,来快速创建GUI界面
在MATLAB命令窗口中输入guide,会打开下图所示的GUIDE快速入门对话框:
勾选将新图形另存为前的方框。这里可以浏览文件保存路径并修改文件名。点击确定后,会打开一个空白的GUI设计界面。同时,会生成两个matlab文件,后缀分别为“.fig”和“.m”。
【注】GUI设计窗口中,“文件”——“预设项”,在弹出的性能设置对话框中选择“在组件选项板中显示名称”(前面打钩),则GUIDE界面下的交互控件面板将会显示各控件的名称。再点击下面的“应用”、“确定”,即可完成设置。再点击下面的“Apply”(应用)、“OK”,即可完成设置。
更具体的教程可以参考这篇文章 在MATLAB中创建图形用户界面GUI!新手适用~
二、修改MATLAB GUI的.fig和.m文件名
如果后面需要修改文件名(即修改MATLAB GUI的.fig和.m文件名)。提供以下两种做法:
1、“文件另存为”的方式(文件——>另存为)——推荐使用这种方式(方便)
设置好新的文件名后,会自动生成两个新的文件,后缀依然分别为“.fig”和“.m”。
![](https://i-blog.csdnimg.cn/blog_migrate/9df76532b6e00c9369dd5276d40a5413.jpeg)
2、直接对文件名进行修改(后缀为“.fig”和“.m”的两个文件都要修改,且一致)。
并且,打开修改后的后缀为“.m”的文件,Ctrl+F,找到其中旧的文件名,点击“Replace All”替换全部。
![](https://i-blog.csdnimg.cn/blog_migrate/a522f4d68b3312a7bcf36bb7b8d2a11f.jpeg)
三、修改MATLAB GUI界面的名字
例如如下界面:
运行时:
期望修改运行时左上角的界面名字为“用户登录界面”。
方法一:
菜单栏“View”——“Property Inspector”,打开GUI界面的属性设置窗口,下拉找到属性“name”,进行设置即可。
(注意:这时候不要选中任何一个控件,否则打开的是对应控件的属性设置窗口,而非GUI界面的属性窗口。可以通过点击GUI界面中控件以外的网格区域来避免选中控件。)
![](https://i-blog.csdnimg.cn/blog_migrate/34a38639c2d79cc084b512cec71a5048.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/53d749981966fd896db9cc822f1fea0e.jpeg)
方法二:在对应的“.m”文件中输入相关代码。
找到“.m”文件中的函数(function varargout = untitled2_OutputFcn(hObject, eventdata, handles))
在该函数下面输入:
程序在运行时,就会得到相应的效果。
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/278ad52e5a776dcefc6eb33ffc8a6fae.jpeg)
四、修改MATLAB GUI界面左上角的Logo
在GUI的“.m”文件中的OpeningFcn函数或者OutputFcn函数中添加以下代码:
本问题参考了网址:https://blog.csdn.net/hycwoaiyl/article/details/80113594
五、GUI的Edit Text控件输入文本默认居中对齐,如何设置其中的文本对齐方式?
双击该控件,打开其属性设置窗口(Property Inspector),找到“HorizontalAlignment”属性,就可以设置left(左对齐)、center(居中)、right(右对齐)。其他控件的对齐方式,设置方法相同。
![](https://i-blog.csdnimg.cn/blog_migrate/e6146b8409bbf48758245449f201016c.png)
六、界面之间的交互——GUI怎么从欢迎界面跳转到另一个主界面?
“做了一个登录界面,当输入帐号密码正确无误后,点击登录会显示一个对话框‘登录成功’。再点击OK按钮会进入主界面,请问怎么实现进入主界面呢?是要做两个fig然后调用吗?还是其他什么办法呢? ”
方法:做两个界面,例如第二个界面命名为GUI2, 设置OK的callback函数为关闭当前的GUI界面,打开第二个GUI界面。用delete或close关闭当前的GUI即可。
具体地,在“登录”按钮的回调函数中写如下语句:
然后保存,运行这个按钮界面,点击按钮就可以出现“GUI2” 界面。
七、GUI界面,如何设置自定义菜单功能和按钮功能相同?
具体地,在GUI界面中,设计了菜单栏中的一些功能,也设计了界面中一些功能按钮。期望菜单栏中的一些菜单项和功能按钮实现的功能一致。也就是说,有相同的回调函数。
类似的问题:
- 给多个控件的callback函数中添加同样的命令;
- 多个控件执行相同的任务;
- 一个控件调用另一个控件的回调函数;
具体解决方法:
方法一:(推荐)
先编写好其中一个按钮的回调函数(Callback),例如一个按钮的 Tag 名为pushbutton_Enter,其回调函数为
而对于那个相应的菜单(Tag名为menu_Enter),其回调函数可以为空代码,即具体的回调函数中除了函数名,不包含具体的调用代码。而是在GUI的XXX_OpeningFcn()或者XXX_OutputFcn()函数中插入下面的两行代码完成设置(XXX为GUI名):
方法二:先编写好其中一个按钮的回调函数(Callback),例如一个按钮的 Tag 名为pushbutton_Enter,其回调函数为
而对于那个相应的菜单(Tag名为menu_Enter),其回调函数按如下代码所示即可:
八、运行GUI时,出现错误:Reference to non-existent field ‘output’
具体错误如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/e273453770d5f72ae682e37edea997a2.jpeg)
解析:
出现这个错误,看看是不是 function XXX_OpeningFcn( hObject, eventdata, handles, varargin ) 函数中(XXX为GUI名)的下面这几行代码发生了变化:
只要把上面这几句代码加入在OpeningFcn()函数中即可。
九、全局变量
“在函数或基本工作空间中,用global声明的变量为全局变量。”
“声明了全局变量的函数或基本工作空间,共享该全局变量,都可以给它赋值。”
“如果函数的子函数也要使用全局变量,也必须用global声明。”
“全局变量要放在函数开始处声明。”
——以上四行引自罗华飞老师的《MATLAB GUI设计学习手记》,第三版,北航出版社,2014年。
在进行MATLAB GUI设计时,有时不同的控件会用到同一个变量,这时就需要定义为全局变量。并且,只要用到全局变量的函数体内都需要用global进行声明。(在不同的子函数里面,只要使用全局变量,都需要用global ‘Varname’ 声明。)
定义多个全局变量时,global 开头,变量名跟着后面,变量名之间用空格隔开即可。
十、在设计GUI界面时,期望运行代码(具体某个算法)的同时,用一个进度条来展示算法的运行进度。
(类似的问题:期望运行进度条的同时,后台也执行着其他代码。)
如题。搜索浏览了一些网页资料和书籍。得出的结论:
MATLAB是一种单线程运行结构。后台程序依次顺序执行。MATLAB不提供异步的功能给用户。
而我这里后台执行的算法代码是一个封装的整体,所以就不可能边执行算法程序,边用进度条展示出程序执行进度。
如果用waitbar()做一个界面上的进度条,也只是给出一个虚假的进度,并且按照顺序执行的思路,也要先展示完进度条,后台才真正开始执行我的算法代码。所以这个想法暂时不能实现。
(该问题也参考了网址:http://www.ilovematlab.cn/thread-315978-1-1.html(MATLAB GUI 在运行进度条的同时后台处理数据))
附: waitbar()函数的官方文档:https://ww2.mathworks.cn/help/matlab/ref/waitbar.html?refresh=true
十一、针对问题十,给出一个实例
声明:该实例引自罗华飞老师的《MATLAB GUI设计学习手记》,第三版,北航出版社,2014年,第329页【例5.2】
【例5.2】动态绘出频率从 1 到 10 依次变化的正弦波曲线,并用进度条显示绘图进度。
新建一个.m脚本文件,将以上实例中的代码复制下来(这段代码不涉及GUI界面的设计)。运行这段代码,就会发现,一边在figure窗口绘制正弦曲线,前面的进度条也一边显示执行进度。
但是你会发现,之所以能够实现上述效果,也是因为waitbar()嵌入在for循环内,相当于将绘制正弦曲线的工作划分成了十个阶段。正弦曲线绘制出一点,进度条也可以跟着更新一点。
十二、自己绘制的GUI界面菜单栏保留MATLAB Figure窗口菜单栏的工具条
在 GUI 的 XXX_OpeningFcn() 函数下插入下面这行代码:
十三、自定义GUI界面中菜单栏下的工具条
上面的问题十二,是直接保留figure窗口的工具条。而本问题是自定义GUI界面的工具条。比如想在自己设计的GUI界面中使用到放大、缩小、3D旋转等功能。
具体方法:
GUI编辑界面的上方菜单栏‘Tools’——‘Toolbar Editor...’:
进入之后(下图所示),左边有一些工具可供选择,双击想要的工具,或者单击选中想要的工具,再点击右边的‘Add’。并且可以设置工具的图标(CData)、Tag、Clicked Callback(回调函数)。
本问题也可以参考下面的网址:
Matlab GUI的菜单和工具栏常用操作——讲解自定义菜单栏和工具条
GUI界面添加菜单栏工具栏问题(点击进入),该网址内二楼提供了一个PDF文档,可以说是比较好的入门学习资料。
十四、怎样将制作的GUI界面定位在屏幕中央?
运行GUI时,期望它出现在屏幕中央位置。提供以下四种方法:
需要选择其中一种代码,将其放置在GUI界面的XXX_OpeningFcn()函数下即可。 推荐使用前三种实现,简洁实用。
movegui( handles.figure1, 'center' ) % figure1为当前GUI界面的Tag
movegui( gcf, 'center' ); % 将GUI界面放置在桌面中央
movegui( hObject, 'center' ); % 将GUI界面放置在桌面中央
set( hObject, 'Units', 'pixels' );
figuresize = get( hObject, 'Position' );
screensize = get( 0, 'screensize' ); % 获取屏幕大小
set( gcf, 'outerposition', [(screensize(3)-figuresize(3))/2,(screensize(4)-figuresize(4))/2,figuresize(3),figuresize(4)]);
该问题参考网址:一个GUI的问题,制作的界面怎样定位在屏幕中间?
PS:在进行MATLAB GUI界面编程学习过程中,也发现了网上的一些不错的学习资料,现将网址链接罗列在下面:
[1] MATLAB GUI的菜单和工具栏常用操作——讲解自定义菜单栏和工具条
[2] GUI界面添加菜单栏工具栏问题——该网页内二楼提供了一个PDF文档(一个实例搞定MATLAB界面编程),也是一个比较好的入门学习资料。
[5] MATLAB GUI 基础编程——MATLAB 中文论坛相关帖子整理——总结整理了MATLAB编程相关的一百多个问题,不局限于GUI设计。