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(析構函數句柄)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章