guidata handles理解

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就得到了傳出來的結果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章