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

jjk*_*ker 2 matlab

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

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

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

Mar*_*arc 7

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

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

function YourGUIName_OpeningFcn(hObject, eventdata, handles, varargin)
Run Code Online (Sandbox Code Playgroud)

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

YourGuiName('importantobject', object1);
Run Code Online (Sandbox Code Playgroud)

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

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

YourGuiName(object1);
Run Code Online (Sandbox Code Playgroud)

在你的openingfcn中,你会添加一行代码

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

你现在可以选择.在gui中存储数据的规范正确方法是将其放在句柄结构中,然后使用guidata存储它,如

handles.myobject = varargin{1};
guidata(hObject, handles); %this is just boilerplate 
Run Code Online (Sandbox Code Playgroud)

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

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

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

global YOURGUI_object;  %it's not my fault; blame MATLAB
YOURGUI_object = varargin{1};
Run Code Online (Sandbox Code Playgroud)

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

祝好运.