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(析構函數句柄)