1.數據怎麼在不同的控件之間傳遞
先看在一個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的信息。
GUIDE創建了一個大缸:結構體handles,handles包括了figure中所有控件的句柄,也包括figure的句柄
比如一個GUI包括一個edit text, 一個panel,一個pop-up menu和一個push button,GUIDE用每個控件的tag來命名handle,handles結構體內容如下:
figure1: 160.0011
edit1: 9.0020
uipanel1: 8.0017
popupmenu1: 7.0018
pushbutton1: 161.0011
output: 160.0011
那我怎麼把自己計算出或者別的什麼數據放到這個缸裏呢? ^_^ 在任何地方 handles.自己的變量名 = 某些值 (其實也就是給結構體添加成員變量) 這樣你就定義了自己的變量。 在任何地方 b=handles.自己的變量名
(結構名加點號來引用成員變量) 就可以得到這個變量值,同樣也可以修改它。 別忘了使用 guidata(hObject,
handles);(不用改,直接黏貼) 在函數末尾來保存你對handles和hObject的操作。(不然你自定義的變量就沒了)
%guidata( 視窗句柄 , 全部句柄 ),如果視窗句柄位置不是視窗句柄,而是一個控件的句柄,那麼這個控件的父視窗(parent figure)會被調用。所以guidata中的視窗句柄 可以是figure的句柄,也可以是figure內所包含的控件的句柄,不管是哪種情況,最終handles會和figure相關聯。全部句柄即GUI句柄handles
2. 怎麼在控件callback函數體之外獲取控件和用戶自己的數據
GUI界面的handles保存着所有控件的信息以及用戶自己的數據,所以只要獲取GUI的handles就可以獲取所有。
比如在自己定義的函數裏獲取handles,只需將handles作爲參數傳進去就可以
function my_function(handles)
% handles是GUI的handles
%調用GUI內任意一控件的信息
%get(handles.你控件的tag,'要獲取的屬性名');
temp=get(handles.my_popup,'Value');
計時timer中:
% 在figure創建完成後創建 timer 對象,將handles傳入Callback函數
t = timer('TimerFcn', {@timerCallback, handles}, 'ExecutionMode', 'fixedDelay', 'Period', 1.0);
% 設置窗口關閉的回調函數
set(handles.figure1, 'DeleteFcn', {@DeleteFcn, t});
% 啓動定時器
start(t);
%傳入handles
function timerCallback(obj, event, handles)
temp=get(handles.my_popup,'Value');
end
% 窗口關閉的響應函數-停止計時器
function DeleteFcn(hObject, eventdata, t)
stop(t);
end
3 在其他子函數或者非figure內控件的callback內保存用戶數據到guidata
GUIDE中, GUIDE生成了一個包括所有GUI句柄的結構體:handles,我們可以保存用戶數據到其中(GUIDE generates
a handles structure that contains the GUI's handles. You can add your own data to it)
guidata( 視窗句柄 , 全部句柄
)
如果視窗句柄位置不是視窗句柄,而是一個控件的句柄,那麼這個控件的父視窗(parent figure)會被調用。所以guidata中的視窗句柄 可以是figure的句柄,也可以是figure內所包含的控件的句柄,不管是哪種情況,最終handles會和figure相關聯。全部句柄即GUI句柄handles
guidata(hObject, handles);
在figure控件callback之內調用guidata(hObject, handles);,hObject是控件的句柄。如果在其他子函數或者非figure控件的callback知中使用guidata保存數據,hObject就不再是控件句柄,會出錯。所以我們要用figure的句柄代替hObject,即handles.figure1
guidata( handles.figure1 ,
handles);
例如在上述計時器的callback函數中保存data: guidata( handles.figure1 ,
handles);
4、在不同GUI之間傳遞數據
傳入
那就來看打開一個GUI界面時,傳給他的參數有哪些。
function mygui_OpeningFcn(hObject,
eventdata, handles, varargin)
所有的啓動參數都是通過varargin傳到它的OpeningFcn裏面的。那啓動參數可以是哪些呢?
1、figure,也就是窗口參數。
比如說position之類
例如:打開這個GUI時,使用這個命令 mygui('Position',[434
234 234 34])則表示打開窗口在這個位置;還有哪些可控屬性可以查help。
2、自定義參數 。
如果傳入的參數不是figure的屬性(matlab查找不到你輸入的屬性名),則你輸入的參數作爲一個向量存放在varargin裏面。
比如mygui('路人甲','80‘),那varargin{1}存放了'路人甲',varargin{2}=’80‘
那mygui中對這讀取兩個數據進行反應,就達到了傳入參數的目的。
傳出
那怎麼把數據傳出來呢?
將你要輸出的數據存在handles.output裏面
在GUI任意地方
handles.output=數據1;
handles.secend_output=數據2;
然後在GUI的outputFcn裏面加上
varaginout{1}=handles.output;
varaginout{2}=handles.secend_output;
這樣就把數據傳出來了。
看每一個GUI的最外層的那句
function varargout = mygui(varargin) 看輸入輸出,就是這樣了。把GUI本身就是一個函數,
b=mygui(一些傳入的參數) 就執行GUI並返回結果
則b就得到了傳出來的結果。