我有一个面向对象的MATLAB应用程序需要一个GUI,我想使用GUIDE进行布局(至少)。我尝试过手动方式,进行控制定位太痛苦了。
我注意到GUIDE非常依赖程序化;它会生成M文件,假定它们是从路径运行的,并且不与任何类或对象相关联。
有没有人有尝试以面向对象的方式使用GUIDE的经验?如果它很简单,我也想自动生成代码,但我愿意让GUIDE生成.fig文件并自己编写代码。
答案 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方法。
祝你好运。