我尝试在Matlab(R2009A)用户界面中实现保存/加载函数。我的对象实现了一个布局函数,它为对象生成一个用户界面。我正在尝试实现保存/加载按钮的回调。“保存”按钮起作用,并将对象保存到一个mat文件中,该文件可以稍后加载。
我的问题是实现加载按钮的回调。我似乎无法从mat文件加载数据并更新新对象的属性。任何关于我哪里出错的建议,以及关于我如何继续工作的建议,都非常感谢。
重要的代码是我的类定义文件,当然,我的实际对象实现了更多的属性和方法,但这里是我所拥有的框架
classdef myObj
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
用户界面布局在单独的文件中定义。
L.
基本上看起来像
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。
代码不会引发任何错误。我编写代码的方式父对象(由
自己
)呼叫后不更新
负载
在该方法中
加载对象
. 因此,这具有预期的效果:
>> var = myObj;
>> var.load_object;
但是,如果我使用
加载MyObjor对象
回调定义于
L.
以这种方式
>> var = myObjl
>> var.LayoutFcn
-> click Load button to call _loadingMyObject_
不影响
var
性质。那就是
var
单击“加载”按钮后仍将具有其默认属性值。
更改要使用的加载方法
设置
正如建议的那样
gnovice
引发以下错误
????使用=>集时出错
无法从FujiCalibration转换为Double。
即使我为每个属性设置/获取方法;如
method set.image(self,II)
% ... some data validation code ...
self.image = II
end
使用循环按建议设置每个字段
Mr Fooz
不是一个真正的选项,因为我的完整类有一个公共常量,当它们被设置时会抛出一个错误。
我正在寻找一种解决方案,它可以避免我必须单独地对每个字段进行代码设置。虽然在这一点上,这似乎是唯一的可能性。