MATLAB GUI编程总结
最近鼓弄毕设,做的是人脸识别方面的东西,用 matlab 编程实现,后来想到做一个GUI界面,经过研究,将自己的收获总结在下面
目录
GUI 两种编程方式
matlab 提供两种编写 GUI 界面的方式:使用 guide + 部分编程、全编程的方式。
使用 guide + 部分编程
matlab 提供 guide 工具以完成 GUI 界面设计(控件资源的添加、布局和属性设置等),并保存到 “.fig” 文件,同时还产生同名的 “.m” 文件,两个文件缺一不可,前者保存 GUI 界面资源的属性,或者主要完成控件回调函数的编写。
全编程方式
这种方式需要用户完全编写程序,包括控件资源的创建,属性设置,回调函数的编写。没有 “.fig” 文件,只依赖于脚本文件。
两种方式的不同
文件组织
前面已经讲了,使用 guide,依赖于两个文件 “.fig” 和 “.m” 文件;而全编程方式只依赖于 “.m” 文件。
用户数据管理方式
使用 guide 方式,程序依靠一个结构体来实现控件之间数据共享,该结构体包含所用控件资源的句柄,还可以动态添加用户的数据(使用guidata(h, data)),回调函数第三个参数就是该变量,因此,在任何控件的回调函数内部都能访问所用的用户数据和资源句柄。第二种方式,采用全局变量数据的共享方式。
程序结构
使用 guide 方式,主程序和各个回调函数的关系是并列的,如下面所示:
function mygui % 主程序 ... function button1Callback(h,eventdata,data) % 回调函数 ... function button2Callback(h,eventdata,data) % 回调函数 ... function func1(x) % 用户自定义函数 ...
而使用第二种方式,必须使用函数嵌套,
function mygui % 主程序 ... function button1Callback(h,eventdata,data) % 回调函数 ... end function button2Callback(h,eventdata,data) % 回调函数 ... end function func1(x) % 用户自定义函数 ... end end
编程步骤
第一种方式
打开 guide 界面
命令行输入 “guide” 并回车,打开设计面板。
添加控件并设置属性
双击添加的控件打开属性检查器,设置控件属性。Tag属性很关键,在默认情况下,Tag 的名称就是控件句柄的名称。
工具栏上常用的工具有:对象浏览器,对齐工具等。
编写回调函数
通过右击控件可以直接跳转到控件的回调函数(Callback)、构造函数(CreateFcn)和析构函数(DeleteFcn)编辑代码处。
注:在空间的CreateFcn(构造函数)中添加以下代码:
function pushbutton1CreateFcn(h, eventdata, handles) ... handles.pushbutton1 = h; guidata(h, handles);
将 pushbutton1 控件句柄添加到结构体,之后就可以在任何回调函数中访问该控件,当然也可以添加其它用户数据。
以下是一个最简单的例子。
example:
function varargout = test2(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @test2_OpeningFcn, ... 'gui_OutputFcn', @test2_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end function test2_OpeningFcn(h, eventdata, handles, varargin) handles.output = h; guidata(h, handles); function varargout = test2_OutputFcn(h, eventdata, handles) varargout{1} = handles.output; function pushbutton1_CreateFcn(h, eventdata, handles) function pushbutton2_CreateFcn(hObject, eventdata, handles) function edit1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end handles.edit1 = h; guidata(h, handles); function pushbutton1_Callback(hObject, eventdata, handles) set(handles.edit1,'string','button2'); function pushbutton2_Callback(hObject, eventdata, handles) set(handles.edit1,'string','button1');
以上程序创建一个edit,两个pushbutton,按不同的pushbutton,在edit中显示不同的内容。值得指出的是,在属性检查器查看pushbutton的回调函数属性时,发现:
Callback 的属性值是 @( hObject, eventdata ) test2( ‘pushbutton1_Callback’, hObject, eventdata, guidata(hObject) )
该属性值自动生成,指明了该控件的回调函数是 test2 文件中名为 “pushbutton1_Callback” 的函数,并且在调用时传递三个实参,hObject(当前对象句柄), eventdata(与控件相关的事件数据), guidata(hObject)(数据结构体)。构造函数也类似,在调用之前已经将当前对象的句柄添加到数据结构体中。
第二种方式
创建控件设置属性
初始化用户数据
编写回调函数及其它用户自定义函数
example:
function test3 hf = figure('units','normalized', ... 'position', [0.38 .4 .41 .51], ... 'visible','off', ... 'menubar', 'none'); h_button1 = uicontrol('parent',hf, ... 'units','normalized', ... 'position',[.30 .62 .1 .06], ... 'string','button1', ... 'callback',@button1Callback); h_button2 = uicontrol('parent',hf, ... 'units','normalized', ... 'position',[.65 .62 .1 .06], ... 'string','button1', ... 'callback',@button2Callback); h_edit1 = uicontrol('style','edit', ... 'parent',hf, ... 'units','normalized', ... 'position',[.16 .33 .75 .15], ... 'backgroundcolor','w'); set(hf,'visible','on'); function button1Callback(h,~) set(h_edit1,'string','button1'); end function button2Callback(h,~) set(h_edit1,'string','button2'); end end
其功能与第一个程序实现的功能相同。由于采用函数嵌套,内嵌函数可以访问主函数中的数据,而不需要维护一个结构体,并作为参数传递给每个回调函数。
常用控件及其属性
组件的层级结构:
不同对象的属性大同小异,常用的属性有:
- 单位(units):normalized | characters | pixels | …
- string(显示字符)
- Tag(标签)
- backgroundcolor(背景颜色)
- foregroundcolor(前景颜色)
- position(位置 [x, y, width, height],单位由 units 确定)
- parent(父对象句柄)
- visible(可见性): on | off
- style(类型)
- callback(回调函数句柄)
- CreateFcn(构造函数句柄)
- DeleteFcn(析构函数句柄)