当您创建带有指南的 gui 时,对于您放在窗格上的每个按钮/文本框/图形等,它会自动生成必要的回调的 shell,因此您所要做的就是填写代码。如果您更改小部件的名称(它们的“标签”)或添加或删除它们,它会为您更新您的 m 文件,这很方便。
You can将你的 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 中存储数据的规范正确方法是将其放入句柄结构中,然后将其与 guidata 一起存储,如下所示
handles.myobject = varargin{1};
guidata(hObject, handles); %this is just boilerplate
样板文件是必要的,因为尽管它的名称如此,句柄并不是 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 的任何方法。
祝你好运。