MATLAB GUI新手備忘錄 收藏
1、從最簡(jiǎn)單的開(kāi)始
編程 最基本的目的 就是——我執(zhí)行一個(gè)操作,程序 做出一個(gè)反應(yīng) 。
“一個(gè)操作”包括:點(diǎn)擊 鼠標(biāo),拖動(dòng) 滑塊,填寫(xiě) 數(shù)據(jù) ,選擇 選項(xiàng)……
“做出一個(gè)反應(yīng)”包括:計(jì)算 一些東西,然后儲(chǔ)存 在哪里,或者貼個(gè)圖 出來(lái),或者顯示 在哪里……
-------------------------------------------------------------------------------------------------------------------
編程的基本思想 :
目的->當(dāng) 點(diǎn)擊按鈕A時(shí) , 然后執(zhí)行 任務(wù)C,
則->進(jìn)入按鈕A的回調(diào)函數(shù) callback里,寫(xiě)下任務(wù)C的代碼 。
-------------------------------------------------------------------------------------------------------------------
a:不知道callback在哪 ??右鍵單擊按鈕,view callbacks->選擇callback)別的控件也一樣。
a:不同的回調(diào)函數(shù)啥意思 ??
callBack
最常用的就是它。如果控件是按鈕,那點(diǎn)擊按鈕時(shí) ,則按鈕下的Callback就會(huì)執(zhí)行;如果是滑塊,則拖動(dòng)滑塊 時(shí),滑塊名下的callback就會(huì)執(zhí)行;總之,就是對(duì)控件默認(rèn)操作 時(shí),matlab后臺(tái)就會(huì)自動(dòng)調(diào)用 它名下的的callback。正常用途,全放在callback下就夠了。如果其他的,實(shí)在是想知道,了解一下也未嘗不可。
ButtonDownFcn
就是鼠標(biāo)在它(代指各種控件)上面點(diǎn)擊一下,你放在這個(gè)函數(shù)名下的代碼就會(huì)執(zhí)行。(ps:按鈕的callback也是點(diǎn)擊,所以會(huì)覆蓋掉這個(gè)buttondownfcn。)
CreateFcn
顧名思義,在生成這個(gè)控件,顯示之前,執(zhí)行你放在這個(gè)函數(shù)名下的代碼;
DeleteFcn
一樣。在控件要銷(xiāo)毀,但是被毀滅之前執(zhí)行這個(gè)函數(shù)名下的代碼。貌似“真的要退出嗎”這一類(lèi)就是寫(xiě)在這里。
KeyPressFcn
當(dāng)前控件獲得焦點(diǎn)且有按鍵按下時(shí)執(zhí)行。(什么是焦點(diǎn)?就是這個(gè)控件被鼠標(biāo)點(diǎn)了(或者是tab輪選到了)。你打開(kāi)一個(gè)記事本,然后再點(diǎn)這個(gè)網(wǎng)頁(yè),再隨便按幾個(gè)按鍵,記事本上有字不?沒(méi)有對(duì)吧。因?yàn)樗鼪](méi)獲得焦點(diǎn),所以你的按鍵它不會(huì)反應(yīng)的。只有你最后再點(diǎn)它一下,再按幾個(gè)按鍵,結(jié)果 怎么樣?有字了吧?)這里的KeyPressFcn也是一樣的道理。
一般在這下面的代碼還會(huì)判斷下按鍵是什么,然后執(zhí)行相應(yīng)的代碼。
ResizeFcn,SelectionChangeFcn 不常用。也懶得去看了。附幾句,控件都有Resize的屬性,好像默認(rèn)是不可調(diào)整,如果要用到這個(gè)函數(shù),去把它打開(kāi)先。
SelectionChangeFcn
是在群按鈕 組件中,改變選擇時(shí),所執(zhí)行的函數(shù)。
哪些控件支持哪些回調(diào)函數(shù) ?很簡(jiǎn)單,你在它上面右鍵就可以看到了,點(diǎn)進(jìn)去就可以編輯了。
可以在property inspect中在需要的回調(diào)函數(shù)下設(shè)置 %automatic就可以自動(dòng)添加相應(yīng)的回調(diào)函數(shù)框架 。
2、常用控件代碼框架參考
---------------------------------------------------------------------
Toggle Button 的callback一般寫(xiě)法
toggle button是什么?設(shè)計(jì) 面板上,左邊那一欄圖標(biāo),看到它名字了吧?沒(méi)看到?File->preference->GUIDE->把那個(gè)show names那一欄勾選上。好了,可以看到了吧 。知道是什么了吧?
拖進(jìn)來(lái),雙擊它,看到它的屬性設(shè)置表。上面各種各樣的屬性,以后有時(shí)間 慢慢研究。
點(diǎn)下它時(shí),它默認(rèn)value ='Max'
不點(diǎn)下它時(shí),它value='Min'
--------
代碼:
functon togglebutton1_callback(hObject,eventdata,handles)
%這一句,現(xiàn)在不用管。自動(dòng)加的。
%%%以下是一般代碼
button_state = get(hObject,'Value')
%控件甲的callback下面hObject就是控件甲,同理控件乙callback下的hObject......
if button_state==get(hObject,'Max')
%則怎么怎么怎么
else if button_state==get(hObject,'Min')
%則怎么怎么怎么
end
--------
備注:button_state隨便取的變量 名,存放按鈕的選擇狀態(tài),別以為它是什么喔。
如果你的button甲是放在一個(gè)buttonGroup里面,則button甲callback下的代碼就要挪到buttonGroup下面去。因?yàn)閎uttonGroup的回調(diào)函數(shù)會(huì)覆蓋掉它成員的回調(diào)函數(shù)。
----------------------------------------
Radio Buttons
------
代碼:
右鍵點(diǎn)選你的Radio按鈕,進(jìn)入編輯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'); %就得到了所輸入 的字符
%因?yàn)閙atlab是把所有的輸入當(dāng)作字符來(lái)看待,如果你是期望的到輸入的數(shù)據(jù)的話,則:
user_entry= str2double(get(hObject,'String')); 這里進(jìn)行一個(gè)數(shù)據(jù)類(lèi)型轉(zhuǎn)換。看函數(shù)名就知道了。
if isnan(user_entry) %nan就是not a number的簡(jiǎn)寫(xiě)。知道這個(gè)函數(shù)意思了吧?
errodlg('You must entry a number value','Bad Input','modal') %跳出一個(gè)對(duì)話框。
end
%正確得到了數(shù)值,以下輸入你的其他代碼
----------
附: 'Bad Input'是指窗口樣式,就像我們?cè)诓僮飨到y(tǒng) 下,經(jīng)常會(huì)跳出一個(gè)黃色感嘆號(hào)的對(duì)話框,或者一個(gè)紅叉的對(duì)話框;
modal是指窗口類(lèi)型,就像一些程序跳出警告對(duì)話框,我們什么也不能做了,只能把那個(gè)對(duì)話框選擇一個(gè)是或者不是,才能繼續(xù)做其他事情。這種對(duì)話框就是modal類(lèi)型。而通常的比如瀏覽器的界面 ,我們打開(kāi)后,可以不管,然后打開(kāi)別的對(duì)話框,這種就是非模態(tài)對(duì)話框。
默認(rèn)在點(diǎn)擊你的界面菜單欄或者界面上的其他組件后,這個(gè)edit text的callback都回被執(zhí)行一遍,所以在你點(diǎn)確定按鈕的時(shí)候,edit callback下讀到的數(shù)據(jù)會(huì)更新的了,不用擔(dān)心!
---------------------------------------------------
Sliders
---------
代碼:
function slider1_callback(hObject,eventdata,handles)
slide_value=get(hObject,'Value');%獲取滑塊當(dāng)前值
%別的代碼
----------
附: 它的Max Min 屬性設(shè)置了滑竿的最大最小范圍值。
---------------------------------------------------
List Boxes
-----------
代碼:
function ........
index = get(handles.listbox1,'Value'); %listbox1是你自己的那個(gè)控件的tag名字
file_list =get(handles.listbox1,'String'); %得到了你的listBoxes的列表
file_name = file_list{index};
%得到了所選擇的項(xiàng)目名,一下寫(xiě)自己的代碼
-------------------
附:
此 callback在鼠標(biāo)在這個(gè)控件上松開(kāi)或者特定的鍵盤(pán)按鍵松開(kāi)(看你怎么設(shè)置它的別的屬性的了)時(shí)候執(zhí)行。
默認(rèn)鍵盤(pán)上 下 鍵可以改變它的值同時(shí)執(zhí)行一次callback。而enter和space不改變它的值,只是執(zhí)行callback
Max-Min 差值是0的話,表示只可以單選;1的話,表示可以多選。這個(gè)可以在他的屬性欄里設(shè)置
----------------------------------------------------------
Pop_up Menus
--------------
代碼:
function .......
val=get(hObject,'Value')
Switch val
case 1
%
case 2
%
defualt
......
end
----------------------------------------------------
Button Groups
------------------
代碼:
function .......
switch get(hObject,'Tag');
%注意這里的hObject和別的不同,并不是指這個(gè)BUtton Group,而是指在組里面,被選中的那個(gè)控件
case 'radio button1' %按鈕1的tag
%。。。。。
case '按鈕2的tag'
%。。。。。
。。。
end
----------
附:所以在這里,如果要拿到button groups本身的話,就用handles.它的tag名 中間一個(gè)點(diǎn)。
--------------------------------------------------
Axes
-------------
它是用來(lái)畫(huà)圖 的,可以說(shuō)是一塊畫(huà)布。它并不算是嚴(yán)格意義上的控件,但可以讓用戶在它的區(qū)域上點(diǎn)擊或者移動(dòng)鼠標(biāo)時(shí)(看你是放在什么callback下了)執(zhí)行一定的代碼。那就要加它自己的callback函數(shù)了。
下面用來(lái)一般功能,所以不用自己的callback,代碼都是寫(xiě)在別的控件回調(diào)函數(shù)下。
代碼:
axes (handles.youraxesname);%選擇你的一個(gè)axes,自然,用它的tag來(lái)選中它
plot (x,y); %這時(shí),所畫(huà)的圖就到它上面了
set(handles.youraxesname,'XMimrFrick','on'); %順便設(shè)置一下它的屬性
grid on; %加上網(wǎng)格
--------------------------------------------------
Active控件
還沒(méi)時(shí)間去研究。這個(gè)是最好用的,因?yàn)榭梢越栌脛e人的現(xiàn)成的東西,畢竟自己不是程序員,沒(méi)有必要編寫(xiě)太多的代碼。一些通用的比如文件 存取對(duì)話框,視頻 放映之類(lèi)的。
可惜,我還沒(méi)時(shí)間去看。呵呵。
3、怎么獲得和設(shè)置控件的屬性
通俗的說(shuō),就是我怎么獲取 編輯框里的字符,滑塊現(xiàn)在的位置,pop up里被選中的選項(xiàng),如何控制 static text顯示我要求的信息
控件的屬性當(dāng)然遠(yuǎn)不止我剛剛說(shuō)的。
在你需要的地方插入以下代碼:
設(shè)置:
set(handles.你控件的tag,'要設(shè)置的屬性名','要設(shè)置的屬性值')
獲?。?br> get(handles.你控件的tag,'要獲取的屬性名')
比如:set(handles.edit1,'string','hello world');
help里可以看到所有可能有用的屬性
MATLAB->Creating Graphical User Interfaces->Laying Out GUIs and Setting Properties->What Properties Do I Need to Set?
4. 數(shù)據(jù)怎么在不同的控件之間傳遞
知道了GUI的數(shù)據(jù)管理規(guī)則,這個(gè)就很簡(jiǎn)單了。
-------------------
先看在一個(gè)GUI界面內(nèi)部的傳遞的數(shù)據(jù)
每一個(gè)控件的回調(diào)函數(shù)頭:
function myc_Callback(hObject, eventdata, handles)
第一個(gè)參數(shù)是hObject ,是跟這個(gè)callback所關(guān)聯(lián)的控件的handles,在它自己的callback下,可以用代號(hào)-> hObject 來(lái)調(diào)用它。。不用管那么麻煩的概念,只用知道,控件自己的回調(diào)函數(shù)調(diào)用自己的屬性,只用hObject.屬性名 就可以了(中間一點(diǎn))。
第二個(gè)參數(shù)是MATLAB的保留參數(shù)
第三個(gè)handles ,是這個(gè)GUI界面的代號(hào)??梢酝ㄟ^(guò)它獲取這個(gè)界面的所有信息。所以在控件A自己的回調(diào)函數(shù)中,要獲取或者設(shè)置別的控件的屬性,就用 handles.別的控件Tag.屬性
------------------------------
handles hObject 都是結(jié)構(gòu)體。正常的編程概念。
handles格式是一個(gè)存放數(shù)據(jù)的缸??丶膆andles是小缸,它的名字叫做hObject;GUI界面的handle是一個(gè)大缸,并且這個(gè)缸名字也叫做handles;大缸里存放了所有的小缸和所有用戶數(shù)據(jù),你只需 handles.控件A的tag 就可以存取控件A的信息。
那我怎么把自己計(jì)算出或者別的什么數(shù)據(jù)放到這個(gè)缸里呢?
^_^ 在任何地方
handles.自己的變量名 = 某些值 (其實(shí)也就是給結(jié)構(gòu)體添加成員變量)
這樣你就定義了自己的變量。
在任何地方
b=handles.自己的變量名 (結(jié)構(gòu)名加點(diǎn)號(hào)來(lái)引用成員變量)
就可以得到這個(gè)變量值,同樣也可以修改它。
別忘了使用
guidata(hObject, handles);( 不用改,直接黏貼) 在函數(shù)末尾來(lái)保存你對(duì)handles和hObject的操作 。(不然你自定義的變量就沒(méi)了)
-----------------------
5、在不同GUI之間傳遞數(shù)據(jù)
-----------這部分是以前寫(xiě)的我發(fā)現(xiàn)我的理解有些問(wèn)題---所以我現(xiàn)在傳遞數(shù)據(jù)用的application data的方法,沒(méi)用這個(gè)-??赡苓€沒(méi)理解透output的函數(shù)作用------------------------
傳入
那就來(lái)看打開(kāi)一個(gè)GUI界面時(shí),傳給他的參數(shù)有哪些 。
function mygui_OpeningFcn(hObject, eventdata, handles, varargin)
所有的啟動(dòng)參數(shù)都是通過(guò)varargin 傳到它的OpeningFcn里面的。那啟動(dòng)參數(shù)可以是哪些呢?
1、figure,也就是窗口參數(shù) 。
比如說(shuō)position之類(lèi)
例如:打開(kāi)這個(gè)GUI時(shí),使用這個(gè)命令 mygui('Position',[434 234 234 34]) 則表示打開(kāi)窗口在這個(gè)位置;還有哪些可控屬性可以查help。
2、自定義參數(shù) 。
如果傳入的參數(shù)不是figure的屬性(matlab查找不到你輸入的屬性名),則你輸入的參數(shù)作為一個(gè)向量存放在varargin里面。
比如mygui('路人甲','80‘),那varargin{1}存放了'路人甲',varargin{2}=’80‘
那mygui中對(duì)這讀取兩個(gè)數(shù)據(jù)進(jìn)行反應(yīng),就達(dá)到了傳入?yún)?shù)的目的。
傳出
那怎么把數(shù)據(jù)傳出來(lái)呢?
將你要輸出的數(shù)據(jù)存在handles.output里面
在GUI任意地方
handles.output=數(shù)據(jù)1;
handles.secend_output=數(shù)據(jù)2;
然后在GUI的outputFcn里面加上
varaginout{1}=handles.output;
varaginout{2}=handles.secend_output;
這樣就把數(shù)據(jù)傳出來(lái)了。
看每一個(gè)GUI的最外層的那句
function varargout = mygui(varargin) 看輸入輸出,就是這樣了。把GUI本身就是一個(gè)函數(shù),
b=mygui(一些傳入的參數(shù)) 就執(zhí)行GUI并返回結(jié)果
則b就得到了傳出來(lái)的結(jié)果。