最近在用Matlab的guide来写GUI界面,就记录一些我对GUI界面的理解。
首先是函数中都有的那些参数hObject,eventdata和handles,其中eventdata我用的2017b的Matlab的官方注释是将在未来版本中定义。
这个就先不管。
1.初始化函数:
这个函数的作用是初始化,即相当于类的初始化,比如python类中的__init__函数在构造函数创建实例后自动调用。
function OpeningFcn(hObject, eventdata, handles, varargin)
2.先看hObject和handles。
他们的作用很相似,hObject和handles的官方解释是句柄,一直没有很搞懂,现在终于明白了一些。
我的理解是GUI界面中的元素就是句柄,或者更加通俗一些的解释,把handle当成C++或是Java中的类类型,而handles就是类的名称,要调用类中的元素就要用到handles。
而hObject和handles的区别就在于hObject是自己,有点像this指针。而handles提供访问全局信息的能力。
比如中hObject = handles.checkbox1;因为通过改变一个控件是需要使其他的控件作出相应,而因为是在函数中,都是局部变量,无法访问到其他控件,而可以根据这里提供的handles访问其他控件。
下面列出了一些常用的元素,当然可以自己随意改变名称:
比如有pushbutton按钮,slider滑动条,radiobutton单选框,checkbox勾选框,edit输入框,popupmenu弹出窗口。
通过set命令设置,
set(ui元素名,属性型,值)
1.设置可视属性,visible属性:
%可视
set(handles.pushbutton1,'visible','on');
%不可视
set(handles.pushbutton1,'visible','off');
%使图不可见
set(gcf,'visible','off');
还可以使窗口不可见:
h = figure(Window_1);%返回Window_1窗口
set(h,'visible','on');
2.设置字符串的值,string属性:
set(handles.text,'string','原始音乐信号');
设置下拉框中各个元素的值:
set(handles.popupmenu_channel_choose,'string',['单声道';'双声道';'三声道']);
实例:
比如这里我要实现的功能是改变勾选checkbox以后显示在text1中显示文字’hello’,就可以这样写
function checkbox1_Callback(hObject, eventdata, handles)
set(handles.text1,'string','Hello','FontSize',18)
3.设置元素的值:
设置勾选框为勾选状态,
set(handles.checkbox_choose_state,'value',1);
4.获取元素的值:
如获取当前下拉菜单的索引值,和具体的值:
function popupmenu1_Callback(hObject, eventdata, handles)
sel = get(hObject,'string');%获取下拉菜单当前选项的索引值
choose = get(hObject,'value');%获得索引值
sel{choose}%存储的时候是cell格式,这样才能取得正确的值
5.关闭当前窗口:
close
6.作图:
axes(handles.axes1)
plot(x,y)
或是直接使用:
plot(handles.axes1,x,y);
清除坐标标签:
set(handles.axes,'xticklabel',[],'yticklabel',[]);
清除图像中的内容:
尤其是重复选择axes显示图像前要先进行清除操作,
cla(handles.axes1);
7.变量传递:
因为GUI的写法里全是函数,也就意味着都是局部变量,参数的传递比较麻烦,我想能不能利用将变量放入handles中传递,
handles.x = x;
handles.y = y;
后来发现不行,因为handles在函数中作为形参,形参不能改变实参的值。
正确的做法:
handles.x = x;
handles.y = y;
guidata(hObject, handles);
这篇文章中介绍了多种传递变量的方法:
传递变量介绍链接
总结:
1.要使用handles一般是改变其他元素,交互式的,比如点某一个按键,显示图片。
2.而hObject则是自身元素。
而每一个元素又有很多的属性,我的理解是C++中的结构体或是另一个类,这个类中也有很多属性,一般是公有的属性,
比如我目前用到的有’value’索引值,'visible’可视化,'BackgroundColor’背景颜色,'string’值。
还有其他一些小内容:gcf = figure(‘当前图像’)
1.切换图像:原理是隐藏当前图像,打开要打开的图像的句柄
set(gcf,'visible','off');
h = figure(新图像);
set(h,'visible','on');
2.运行命令:
要运行的程序为fun.m
run('fun')
3.要同一个界面上画多幅图像:
axes(handles.axes1)
画图命令(不加figure或是subplot命令)
axes(handles.axes2)
画图命令
4.改变下拉菜单中的内容:
set(handles.popupmenu1,'string',{'A','B'})
5.显示Latex公式,目前我只知道text命令支持:
hAxes = axes('units','normalized','position',[0,0,1,1],'visible','off');%作用是划分figure区域为[0 0 1 1]
text(0.17,0.85,['$','\omega_{R}(n)=R_{N}(n)','$'],'interpreter','latex','fontsize',18);
6.实时显示时间
T=timer('tag','timer1','BusyMode','queue','ExecutionMode','fixedrate','period',1,'timerfcn',{@t_update,handles});
start(T);
function t_update(obj,event,handles)%显示时间要定时刷新
xingqi={'日','一','二','三','四','五','六'}; %星期字符串
set(handles.text2, 'String',[datestr(clock, 31) ' 星期' xingqi{weekday(now)}],'FontSize',15);
7.显示消息框:
msgbox('请先选择播放的乐曲','提示')
推荐一本学习Matlab的UI设计的好书,MATLAB GUI设计学习手记 这里可以下载源码源码下载可以学习到很多。