将GUIDE与面向对象的MATLAB结合使用?

时间:2010-05-25 21:25:08

标签: matlab

我有一个面向对象的MATLAB应用程序需要一个GUI,我想使用GUIDE进行布局(至少)。我尝试过手动方式,进行控制定位太痛苦了。

我注意到GUIDE非常依赖程序化;它会生成M文件,假定它们是从路径运行的,并且不与任何类或对象相关联。

有没有人有尝试以面向对象的方式使用GUIDE的经验?如果它很简单,我也想自动生成代码,但我愿意让GUIDE生成.fig文件并自己编写代码。

1 个答案:

答案 0 :(得分:7)

当您使用向导创建一个gui时,对于您放置在窗格上的每个按钮/文本框/图形等,它会自动生成用于必要回调的shell,因此您只需填写代码即可。如果您更改窗口小部件的名称(它们的“标签”)或添加或删除它们,它会为您更新您的m文件,这很方便。

可以将你的gui与对象联系起来;自动生成的m文件具有如下所示的功能大纲

function YourGUIName_OpeningFcn(hObject, eventdata, handles, varargin)

你可以要求有人通过varargin传递你的gui一个或多个对象。规范的matlab方法是传递参数名称/值对,因此命令行的调用看起来像

YourGuiName('importantobject', object1);

但你也可以(特别是如果只有一个唯一的参数)假设varargin {1}是一个特定参数,varargin {2}是第二个,依此类推

在这种情况下,来自命令行的调用将是

YourGuiName(object1);

在你的opensfcn中,你会添加一行像

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 

样板文件是必需的,因为尽管它的名称,句柄不是Handle的子类,而是通过值传递,而不是引用。 guidata命令可以处理与gui数字相关的某个位置,这样你就可以在随后的回调中得到它。

这种方法的问题在于,当你将一个大对象放在句柄中时,它会使guidata命令永远占用。这是正确的,即使除非绝对必要,否则MATLAB在传递值时不应该复制数据,如果你的对象是一个Handle,它往往是真的,它需要4个字节来回传递。不要问我为什么,但我怀疑它与内存管理有关。垃圾收集。

如果您的gui需要一段时间来执行命令,并且您使用配置文件并将其挂在guidata命令上,那么您应该声明您的对象是全局的并以这种方式处理它

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

然后你可以让你所有的回调都执行他们需要的任何YOURGUI_object方法。

祝你好运。