gpt4 book ai didi

matlab - 将 GUIDE 与面向对象的 MATLAB 一起使用?

转载 作者:行者123 更新时间:2023-12-02 07:52:25 25 4
gpt4 key购买 nike

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

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

有没有人有过以面向对象的方式使用 GUIDE 的经验?如果直截了当,我也想做自动代码生成,但我愿意让 GUIDE 只生成 .fig 文件并自己编写代码。

最佳答案

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

可以将您的图形用户界面与对象相关联;自动生成的 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 中存储数据的规范正确方法是将它放在 handles 结构中,然后用 guidata 存储它,如

handles.myobject = varargin{1};
guidata(hObject, handles); %this is just boilerplate

样板文件是必要的,因为尽管它的名字是 handles,但它不是 Handle 的子类,并且是通过值而不是引用传递的。 guidata 命令棒处理与 gui 图关联的某个位置,因此您可以在后续回调中获取它。

这种方法的问题在于,当您将一个大对象放入句柄中时,它会使 guidata 命令永远无法执行。即使 MATLAB 不应该在按值传递时复制数据,除非绝对必要,这也是正确的,如果您的对象是句柄,它甚至是正确的,来回传递大约 4 个字节。不要问我为什么,但我怀疑它与内存管理和垃圾收集有关。

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

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

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

祝你好运。

关于matlab - 将 GUIDE 与面向对象的 MATLAB 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com