2010-05-25 28 views
2

我有一個面向對象的MATLAB應用程序需要一個圖形用戶界面,我想使用GUIDE作爲佈局(至少)。我嘗試了手動方式,並且做控制定位太痛苦了。在面向對象的MATLAB中使用GUIDE?

我注意到GUIDE是非常程序化的,它會生成M文件,假定它們是從路徑運行的,並且不與任何類或對象關聯。

有沒有人有嘗試以面向對象的方式使用GUIDE的經驗?如果它很簡單,我也想自動生成代碼,但是我願意讓GUIDE生成.fig文件並自己編寫代碼。

回答

7

當您使用嚮導創建gui時,對於放置在窗格上的每個按鈕/文本框/圖形等,它會自動生成必要回調的shell,因此您只需填寫代碼即可。如果您更改小部件的名稱(它們的「標籤」)或添加或刪除它們,它會爲您更新您的m文件,這很方便。

可以聯繫你的gui與對象;自動生成的M文件有一個功能輪廓,看起來像這樣

function YourGUIName_OpeningFcn(hObject, eventdata, handles, varargin) 

你可以要求別人通過你的GUI對象或通過varargin對象。該規範的MATLAB辦法做到這一點是通過參數名稱/值對,所以從命令行調用看起來像

YourGuiName('importantobject', object1); 

但你也可以(尤其是如果只有一個唯一參數)承擔varargin { 1}是一個特定的參數,varargin {2}是第二個,依此類推

在這種情況下,從命令行調用將

YourGuiName(object1); 

在你openingfcn,你會再添加一個線如

if (length(varargin) < 1) || ~isa(varargin{1}, 'importantObjectType') 
    error ('you must pass an importantobject to YourGuiName, see help'); 
end 
myimportantobject = varargin{1} 

您現在可以選擇製作了。將數據存儲在你的GUI中規範地正確的方法是把它的手柄結構,然後將其與guidata存儲,如

handles.myobject = varargin{1}; 
guidata(hObject, handles); %this is just boilerplate 

的樣板是必要的,因爲,儘管它的名字,拉手不會繼承處理,並通過價值傳遞,而不是參考。 guidata命令可以處理與gui圖相關的任何地方,以便在隨後的回調中使用。

這種方法的問題是,當您將大對象放在句柄中時,它會使guidata命令永遠持續下去。即使MATLAB在傳值時不應該複製數據,除非絕對必要,即使您的對象是一個句柄,即使4字節來回傳遞也是如此。不要問我爲什麼,但我懷疑它與內存管理&垃圾回收有關。

如果你的GUI是需要一些時間來執行命令,並使用個人資料,看看它掛在guidata命令,你應該只需要聲明你的對象是一個全球性和處理它的方式

global YOURGUI_object; %it's not my fault; blame MATLAB 
YOURGUI_object = varargin{1}; 

然後,您可以讓所有回調執行他們所需的任何YOURGUI_object方法。

祝你好運。

+0

感謝您的意見,Marc。在GUIDE的自動生成的M文件中,在初始化代碼中有很大的可怕警告,聲明「不要編輯該代碼」,所以我沒有打算嘗試搞亂輸入參數。這個警告是否被安全忽略?我曾經假定它會打破自動生成例程或者其他的東西。 – jjkparker 2010-05-26 11:32:37

+0

你不許亂用是在主函數中,看起來像這樣 %開始初始化代碼的一部分 - DO NOT EDIT 代碼 %結束初始化代碼 - DO NOT EDIT 還有什麼是公平的遊戲編輯。如果有創建fcns,不要刪除它們,因爲它們將在啓動時調用(如果需要,可以刪除它們中的所有代碼)。除此之外,還有 – Marc 2010-05-26 12:26:54

+0

好吧,好的,這是事情。我想在GUIDE中創建這個GUI,並讓它由一個對象來表示。這意味着在構造函數中,GUIDE生成的M文件需要用MyGui(obj,varargin)語法來調用。這似乎需要編輯您不應該編輯的初始化代碼。我可以讓MyGui成爲一個靜態函數,但它不能訪問我的任何對象數據。我感覺到真正的「面向對象」的東西需要回調作爲方法,所以我可能需要編寫自己的代碼。 – jjkparker 2010-05-26 12:48:24

相關問題