Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我有一个需要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的任何方法。 祝好运。 更多&回答... |
![]() |
![]() |