MATLAB GUI编程总结

MATLAB GUI编程总结

最近鼓弄毕设,做的是人脸识别方面的东西,用 matlab 编程实现,后来想到做一个GUI界面,经过研究,将自己的收获总结在下面

目录

GUI 两种编程方式

matlab 提供两种编写 GUI 界面的方式:使用 guide + 部分编程、全编程的方式。

使用 guide + 部分编程

matlab 提供 guide 工具以完成 GUI 界面设计(控件资源的添加、布局和属性设置等),并保存到 “.fig” 文件,同时还产生同名的 “.m” 文件,两个文件缺一不可,前者保存 GUI 界面资源的属性,或者主要完成控件回调函数的编写。

全编程方式

这种方式需要用户完全编写程序,包括控件资源的创建,属性设置,回调函数的编写。没有 “.fig” 文件,只依赖于脚本文件。

两种方式的不同

  1. 文件组织

    前面已经讲了,使用 guide,依赖于两个文件 “.fig” 和 “.m” 文件;而全编程方式只依赖于 “.m” 文件。

  2. 用户数据管理方式

    使用 guide 方式,程序依靠一个结构体来实现控件之间数据共享,该结构体包含所用控件资源的句柄,还可以动态添加用户的数据(使用guidata(h, data)),回调函数第三个参数就是该变量,因此,在任何控件的回调函数内部都能访问所用的用户数据和资源句柄。第二种方式,采用全局变量数据的共享方式。

  3. 程序结构

    使用 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

编程步骤

第一种方式

  1. 打开 guide 界面

    命令行输入 “guide” 并回车,打开设计面板。

  2. 添加控件并设置属性

    双击添加的控件打开属性检查器,设置控件属性。Tag属性很关键,在默认情况下,Tag 的名称就是控件句柄的名称。

    工具栏上常用的工具有:对象浏览器,对齐工具等。

  3. 编写回调函数

    通过右击控件可以直接跳转到控件的回调函数(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)(数据结构体)。构造函数也类似,在调用之前已经将当前对象的句柄添加到数据结构体中。

第二种方式

  1. 创建控件设置属性

  2. 初始化用户数据

  3. 编写回调函数及其它用户自定义函数

    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(析构函数句柄)

猜你喜欢

转载自blog.csdn.net/healingwounds/article/details/79945228