2010-05-25 26 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

相关问题