簡體   English   中英

使用GUIDE和面向對象的MATLAB?

[英]Using GUIDE with object-oriented MATLAB?

我有一個需要GUI的面向對象的MATLAB應用,並且我想至少使用GUIDE作為布局。 我已經嘗試過手動方式,並且進行控件定位實在是太痛苦了。

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

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

當您創建帶有向導的gui時,對於您放在窗格中的每個按鈕/文本框/圖形等,它會自動生成必要回調的外殼,因此您要做的就是填寫代碼。 如果您更改小部件的名稱(它們的“標簽”)或添加或刪除它們,它將為您更新m文件,這非常方便。

可以將gui與對象相關聯; 自動生成的m文件的功能輪廓如下所示

function YourGUIName_OpeningFcn(hObject, eventdata, handles, varargin)

您可以要求某人通過varargin向您的gui傳遞一個或多個對象。 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中的正確方法是將其放在handles結構中,然后與guidata一起存儲,如

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

樣板是必需的,因為盡管句柄名叫Handle,但它不是Handle的子類,而是通過值而不是引用傳遞的。 guidata命令將句柄與gui圖形相關聯,以便您可以在后續回調中獲取它。

這種方法的問題在於,當您在句柄中放置一個大對象時,它會使guidata命令永久占用。 即使MATLAB除非絕對必要,也不應該在按值傳遞數據時復制數據,但事實還是如此,如果您的對象是Handle,則它需要大約4個字節來回傳遞,這甚至是事實。 不要問我為什么,但是我懷疑這與內存管理和垃圾回收有關。

如果您的gui需要一段時間來執行命令,並且您使用profile並看到它掛在guidata命令上,則應該只聲明您的對象為全局對象並以這種方式處理它

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

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

祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM