[轉]matlab GUI 新手入門——最基本的幾個概念


本文摘自iLoveMatlab論壇

1、從最簡單的開始

編程的基本思想是:我執行一個操作,程序做出一個反應。“一個操作”包括點擊鼠標、拖動滑塊、填寫數據、選擇選項等;“做出一個反應”包括計算、儲存在哪里、貼個圖出來、顯示在哪里。
簡言之:當點擊按鈕A時, 然后執行任務C,則進入按鈕A的回調函數callback里,寫下任務C的代碼。

幾個基本概念

  • CallBack: 最常用的。點擊按鈕時,按鈕下的Callback就會執行;拖動滑塊時,滑塊名下的callback就會執行;總之,正常用途全放在callback下。
  • ButtonDownFcn:單擊,這個函數名下的代碼就會執行。(ps:按鈕的callback也是點擊,覆蓋掉buttondownfcn。)
  • CreateFcn:顧名思義,在生成這個控件,顯示之前,執行這個函數名下的代碼。
  • DeleteFcn: 顧名思義,在控件要銷毀,但是被毀滅之前執行這個函數名下的代碼。貌似“真的要退出嗎”這一類。
  • KeyPressFcn:當前控件獲得焦點且有按鍵按下時執行。
  • SelectionChangeFcn:在群按鈕組件中改變選擇時,所執行的函數。

2、常用控件代碼框架參考

Toggle Button

functon   togglebutton1_callback(hObject,eventdata,handles)
%這一句不用管。自動加的。 
button_state = get(hObject,'Value') 
%控件甲的callback下面hObject就是控件甲,同理控件乙callback下的hObject......
if button_state==get(hObject,'Max')
    %則……

else if button_state==get(hObject,'Min')
     %則……

end

PS:button_state是變量名,存放按鈕的選擇狀態。如果button甲放在一個buttonGroup里,則button甲callback下的代碼就要挪到buttonGroup下面去。因為buttonGroup的回調函數會覆蓋掉它成員的回調函數。

Radio Buttons

右鍵Radio按鈕,進入編輯callback

function ………………略
if(get(hObject,'Value')==get(hObject,'Max'))
   %被選中了,你想怎么樣
else
    %不被選中,你想怎么樣
end

Check Boxes
if(get(hObject,'Value')==get(hObject,'Max'))
   %被選中了,你想怎么樣
else
    %不被選中,你想怎么樣
end

Edit Text

function edit1_Callback(hObject,eventdata,handles)
user_string = get(hObject,'String');    %就得到了所輸入的字符
%matlab把所有輸入當作字符,如果期望輸入數據,則進行數據類型轉換:

user_entry= str2double(get(hObject,'String'));    
if isnan(user_entry)         %nan就是not a number的簡寫。
     errodlg('You must entry a number value','Bad Input','modal')      %跳出一個對話框。
end
PS: 'Bad Input'是指窗口樣式,如黃色感嘆號或者紅叉的對話框;modal是指窗口類型,如警告對話框。

Sliders
function slider1_callback(hObject,eventdata,handles)
slide_value=get(hObject,'Value');%獲取滑塊當前值
%別的代碼

PS:它的Max Min 屬性設置了滑竿的最大最小范圍值。

List Boxes

function ........
index = get(handles.listbox1,'Value');  %listbox1控件的tag名
file_list =get(handles.listbox1,'String');   %得到了listBoxes的列表
file_name = file_list{index};%得到了所選擇的項目名

%別的代碼

PS:此callback在鼠標在這個控件上松開或者特定的鍵盤按鍵松開(看怎么設置屬性)時執行。默認鍵盤上下鍵可以改變它的值同時執行一次callback。而enter和space不改變它的值,只是執行callback。Max-Min 差值是0的話,表示只可以單選;1的話,表示可以多選。這個可以在他的屬性欄里設置。

Pop_up Menus

function .......
val=get(hObject,'Value')
Switch val
case 1
%
case 2
%
defualt
......
end

Button Groups

function .......
switch get(hObject,'Tag');%注意這里的hObject和別的不同,不是指Button Group,而是指在組里面被選中的那個控件
case 'radio button1'   %按鈕1的tag
     %。。。。。
case '按鈕2的tag'
    %。。。。。
end

Axes

axes(handles.youraxesname);%選擇一個axes

plot(x,y);  %這時所畫的圖就到它上面了
set(handles.youraxesname,'XMimrFrick','on'); %順便設置一下它的屬性
grid on; %加上網格

3、怎么獲得和設置控件的屬性

通俗的說,就是怎么獲取編輯框里的字符、滑塊現在的位置、pop up里被選中的選項,如何控制static text顯示我要求的信息等。

  • 設置:set(handles.控件的tag,'要設置的屬性名','要設置的屬性值')。比如:

    set(handles.edit1,'string','hello world');
    
  • 獲取:get(handles.控件的tag,'要獲取的屬性名')

help里可以看到所有可能有用的屬性:

MATLAB->Creating Graphical User Interfaces->Laying Out GUIs and Setting Properties->What Properties Do I Need to Set?

4、數據怎么在不同的控件之間傳遞

先看在一個GUI界面內部的傳遞數據。每一個控件的回調函數頭:

function myc_Callback(hObject, eventdata, handles)

第一個參數是hObject,是跟這個callback所關聯的控件的handles,在它自己的callback下,可以用代號-> hObject 來調用它。即控件自己的回調函數調用自己的屬性,只用hObject.屬性名就可以了(中間一點)。
第二個參數是MATLAB的保留參數。

第三個handles是這個GUI界面的代號,可以通過它獲取這個界面的所有信息。所以在控件A自己的回調函數中,要獲取或者設置別的控件的屬性,就用 handles.別的控件Tag.屬性
handles hObject 都是結構體。handles格式是一個存放數據的缸。控件的handles是小缸,它的名字叫做hObject;GUI界面的handle是一個大缸,並且這個缸名字也叫做handles;大缸里存放了所有的小缸和所有用戶數據,你只需handles.控件A的tag,就可以存取控件A的信息。

把自己計算出或者別的什么數據放到這個缸里,可以在任何地方:
handles.變量名 = 某些值 (其實也就是給結構體添加成員變量)
b=handles.變量名 (結構名加點號來引用成員變量)
就可以得到這個變量值,同樣也可以修改它。
別忘了使用guidata(hObject, handles);在函數末尾來保存你對handles和hObject的操作。(不然你自定義的變量就沒了)

5、在不同GUI之間傳遞數據

數據傳入

先看打開一個GUI界面時,傳給他的參數有哪些。

 function mygui_OpeningFcn(hObject, eventdata, handles, varargin)

所有的啟動參數都是通過varargin傳到它的OpeningFcn里面的。啟動參數包括:
figure,也就是窗口參數,如position之類。例如:打開這個GUI時,使用命令

mygui('Position',[434 234 234 34])

表示打開窗口在這個位置;還有哪些可控屬性可以查help。
自定義參數,如果傳入的參數不是figure的屬性(matlab查找不到你輸入的屬性名),則輸入的參數作為一個向量存放在varargin里面。比如mygui('路人甲','80‘),那varargin{1}存放了'路人甲',varargin{2}=’80‘

數據傳出

看每一個GUI的最外層的那句 function varargout = mygui(varargin)。把GUI本身看做一個函數,b=mygui(一些傳入的參數) 就執行GUI並返回結果,b就得到了傳出來的結果。

在GUI任意地方,將要輸出的數據存在handles.output里面。

handles.output=數據1;
handles.secend_output=數據2;

然后在GUI的outputFcn里面加上

varaginout{1}=handles.output;
varaginout{2}=handles.secend_output;

這樣就把數據傳出來了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM