我正在尝试在 MATLAB (R2009a) UI 中实现保存/加载功能。我的对象实现了一个为对象生成用户界面的布局函数。我正在尝试实现保存/加载按钮的回调。保存按钮起作用并将对象保存到以后可以加载的 MAT 文件中。
我的问题是实现加载按钮的回调。我似乎无法从 MAT 文件中加载数据并更新新对象的属性。非常感谢任何关于我哪里出错的建议以及关于我如何进行的建议。
重要的代码是我的类定义文件当然我的实际对象实现了更多的属性和方法,但这是我所拥有的框架
classdef myObj<handle
properties
image % property holds a matlab image matrix
objCount % number of objects in image
end
properties(Transient=true)
parent
children
end
methods
function myObj
% empty constructor
end
function load_object(self)
% ask user for file
[fileName, pathToFile]=uigetfile('*.mat','Select .mat file');
tmp = load(fullfile(pathToFile,fileName);
if isfield(tmp,'obj')
self = tmp.obj;
end
end
LayoutFcn(self) % UI layout function
end
end
UI 布局在一个单独的文件LayoutFcn.m中定义,基本上看起来像
function LayoutFcn(self)
% create figure window and add various UI elements
...
% create load button
self.children(end+1) = uipushtool('Parent',hToolbar, ... % set parent to current toolbar
'CData',iconRead('open-document.png'), ... % read icon image from file
'Tag','uiLoad', ...
'ClickedCallback',@(hObj,event)loadingMyObject(self,hObj,event));
% create save button
self.children(end+1) = uipushtool('Parent',hToolbar, ... % set parent to current toolbar
'CData',iconRead('save-document.png'), ... % read icon image from file
'Tag','uiSave', ...
'ClickedCallback',@(hObj,event)savingMyObject(self,hObj,event));
...
end
function loadingMyObject(self,hObj,event)
self.load_object; % call load_object method defined above in class definition
end
function savingMyObject(self,hObj,event)
[fileName,pathName]=uiputfile('.mat','Save object to MAT file');
obj = self;
save(fullfile(pahtName,fileName),'obj')
end
注意:我使用的是 MATLAB R2009a。
该代码不会引发任何错误。在方法load_object中调用LOAD之后,我编写父对象(由self表示)的代码的方式不会得到更新。所以,这有预期的效果:
>> var = myObj;
>> var.load_object;
但是,如果我 以这种方式使用LayoutFcn.m中定义的loadingMyObject回调
>> var = myObjl
>> var.LayoutFcn
-> click Load button to call _loadingMyObject_
不影响var属性。也就是说var在单击 Load 按钮后仍将具有其默认属性值。
按照gnovice的建议将加载方法更改为使用set会引发以下错误
???使用 ==> 从 FujiCalibration 将转换设置为 double 时出错是不可能的。
即使我为每个属性设置/获取方法;如在
method set.image(self,II) % ... some data validation code ... self.image = II end
使用循环来设置Fooz 先生建议的每个字段并不是一个真正的选择,因为我的全班有公共常量,当它们被设置时会抛出错误。
我正在寻找一种解决方案,以避免我不得不单独手动设置每个字段的代码。尽管在这一点上,这似乎是唯一的可能性。