Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:41   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 使用GUIDE和面向对象的MATLAB?

我有一个需要GUI的面向对象的MATLAB应用,并且我想至少使用GUIDE作为布局。我已经尝试过手动方式,并且进行控件定位实在是太痛苦了。

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

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



回答:

当您创建带有向导的gui时,对于您放在窗格中的每个按钮/文本框/图形等,它会自动生成必要回调的外壳,因此您要做的就是填写代码。如果您更改小部件的名称(它们的“标签”)或添加或删除它们,它将为您更新m文件,这非常方便。

可以将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中的正确方法是将其放在handles结构中,然后与guidata一起存储,如

handles.myobject = varargin{1}; guidata(hObject, handles); %this is just boilerplate 样板是必需的,因为尽管句柄名叫Handle,但它不是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的任何方法。

祝好运。



更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 01:22


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.