1. 程式人生 > >matlab GUI 新手入門

matlab GUI 新手入門

原始地址未知

1、從最簡單的開始

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

幾個基本概念:    

CallBack: 最常用的。點選按鈕時,按鈕下的Callback就會執行;拖動滑塊時,滑塊名下的callback就會執行;總之,正常用途全放在callback下。
ButtonDownFcn:單擊,這個函式名下的程式碼就會執行。(ps:按鈕的callback也是點選,覆蓋掉buttondownfcn。)
CreateFcn

:顧名思義,在生成這個控制元件,顯示之前,執行這個函式名下的程式碼。

DeleteFcn: 顧名思義,在控制元件要銷燬,但是被毀滅之前執行這個函式名下的程式碼。貌似“真的要退出嗎”這一類。
KeyPressFcn:當前控制元件獲得焦點且有按鍵按下時執行。
SelectionChangeFcn:在群按鈕元件中改變選擇時,所執行的函式。

       
2、常用控制元件程式碼框架參考

Toggle Button 的callback一般寫法

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

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

end
PS:button_state是變數名,存放按鈕的選擇狀態。如果button甲放在一個buttonGroup裡,則button甲callback下的程式碼就要挪到buttonGroup下面去。因為buttonGroup的回撥函式會覆蓋掉它成員的回撥函式。
RadioButtons 
右鍵Radio按鈕,進入編輯callback
function ………………略
if(get(hObject,'Value')==get(hObject,'Max'))
   %被選中了,你想怎麼樣
else
   %不被選中,你想怎麼樣
end

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

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

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

Sliders
function slider1_callback(hObject,eventdata,handles)
slide_value=get(hObject,'Value');%獲取滑塊當前值
%別的程式碼
PS:它的Max Min 屬性設定了滑竿的最大最小範圍值。

ListBoxes
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和別的不同,不是指ButtonGroup,而是指在組裡面被選中的那個控制元件
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、怎麼獲得和設定控制元件的屬性

通俗的說,就是怎麼獲取編輯框裡的字元、滑塊現在的位置、popup裡被選中的選項,如何控制static text顯示我要求的資訊等。

設定:set(handles.控制元件的tag,'要設定的屬性名','要設定的屬性值')。比如:set(handles.edit1,'string','helloworld');
獲取:get(handles.控制元件的tag,'要獲取的屬性名')

help裡可以看到所有可能有用的屬性:MATLAB->CreatingGraphical User Interfaces->Laying Out GUIs andSetting Properties->What Properties Do I Need toSet?


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',[434234 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;

這樣就把資料傳出來了。