資源描述:
《matlab gui數(shù)據(jù)傳遞總結(jié)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、Matlab的GUI參數(shù)傳遞方式總結(jié)其實Matlab提供了很多種直接或間接方法實現(xiàn)多fig中的數(shù)據(jù)共享,只是大家沒有注意罷了:1、全局變量2、作為函數(shù)的參數(shù)傳遞3、利用控件的userdata數(shù)據(jù)4、為handles結(jié)構(gòu)體添加新字段5、setappdata函數(shù)為句柄添加數(shù)據(jù)6、跨空間計算evalin和賦值assignin7、將數(shù)據(jù)保存到文件,需要時讀取8、帶參數(shù)調(diào)用GUI的M文件9、嵌套函數(shù)(不適用于GUIDE中,只適用純命令是的GUI)一、全局變量運用global定義全局變量傳遞參數(shù),適用于gui內(nèi)控件間以及不同gui間。這種方式恐怕是最簡單的方式,是很省心!但是,簡單的問題
2、就在于有時你會很頭疼!因為在每一個要到該全局變量的地方,你都要添一句gloalx,還有就是如果你在一個地方修改了x的值,那么所有x的值就都變了!有的時候恐怕會出現(xiàn)紊亂。另一個更重要的問題在于,套用C++的一句話,全局變量破壞了程序的封裝性!所以,全局變量是能少用盡量少用。以下創(chuàng)造一個簡單的GUI給大家說明一下,建一個GUI,包含兩個按鈕,一個坐標(biāo)系,一個用來畫y=sin(x),一個用來畫y=cos(x);eg:在GUI的OpeningFcn函數(shù)中寫:globalxy1y2x=0:.1:2*pi;y1=sin(x);y2=cos(x);在pushbutton1_Callback
3、函數(shù)中寫Globalxy1Plot(x,y1)在pushbutton1_Callback函數(shù)中寫Globalxy2Plot(x,y2)全局變量是比較方便的,但全局變量會破壞封閉性,如果不是有大量數(shù)據(jù)要傳遞,建議不要使用。二、運用gui本身的varain{}、varaout{}傳遞參數(shù)這種方式僅適用于gui間傳遞數(shù)據(jù),且只適合與主子結(jié)構(gòu),及從主gui調(diào)用子gui,然后關(guān)掉子gui,而不適合遞進(jìn)結(jié)構(gòu),即一步一步實現(xiàn)的方式。輸入?yún)?shù)傳遞(主要在子gui中設(shè)置):比如子GUI的名稱為subGUI,設(shè)想的參數(shù)輸入輸出為:[out1,out2]=subGUI(in1,in2)在subGU
4、I的m文件中(由GUIDE自動產(chǎn)生):1.第一行的形式為:functionvarargout=subGUI(varargin)該行不用做任何修改;varargin和varargout分別是一個可變長度的cell型數(shù)組。輸入?yún)?shù)in1和in2保存在varargin中,輸出參數(shù)out1,out2包含在varargout中;2.在subGUI的OpeningFcn中,讀入?yún)?shù),并用guidata保存,即:handles.in1=varargin{1};handles.in2=varargin{2};guidata(hObject,handles);返回參數(shù)的設(shè)置:1.在主GUI的O
5、peningFcn函數(shù)中加上[out1,out2]=subGUI(in1,in2),用于調(diào)用子gui,并在結(jié)尾加上uiwait(handles.figure1);figure1是subGUI的Tag,主要是等待調(diào)用子gui的過程,從而獲得子gui的輸出參數(shù)out1、out2;2.subGUI中控制程序結(jié)束(如"OK”和"Cancel"按鈕)的callback末尾加上uiresume(handles.figure1),注意是主gui的窗口handles.figure1,不要將delete命令放在這些callback中;3.在子GUI的OutputFcn中設(shè)置要傳遞出去的參數(shù),如
6、varargout{1}=handles.out1;varargout{2}=handles.out2;末尾添加delete(handles.figure1);結(jié)束程序。在GUI的OpenFcn中,如果不加uiwait,程序會直接運行到下面,執(zhí)行OutputFcn。也就是說程序一運行,返回值就確定了,再在其它部分對handles.output作更改也沒有效果了。加上uiwait后,只有執(zhí)行了uiresume后,才會繼續(xù)執(zhí)行到OutputFcn,在此之前用戶有充分的時間設(shè)置返回值。通過以上設(shè)置以后,就可以通過[out1,out2]=subGUI(in1,in2)的形式調(diào)用該子程
7、序。在一個GUI中調(diào)用另一個GUI時,主GUI不需要特別的設(shè)置,同調(diào)用普通的函數(shù)一樣。在打開子GUI界面的同時,主程序還可以響應(yīng)其它的控件。不需要擔(dān)心子GUI的返回值被傳錯了地方。三、userdata數(shù)據(jù)直接通過對象的userdata屬性進(jìn)行各個callback之間的數(shù)據(jù)存取操作,主要適用于gui內(nèi)。首先必須將數(shù)據(jù)存儲到一個特定的對象中,假設(shè)對象的句柄值為ui_handle,需要存儲的值為value,則輸入以下程序即可:set('ui_handle','UserData',Value);此時,value