基本上和上面一样。
在我的MATLAB GUI中,我有一个按钮,可以从文本框中检索数据并将其保存在数组句柄中(更具体地说是多个航点)。我在后期使用这个矩阵,所以我需要存储在句柄中的数据。
在回调函数中,我调用另一个执行此操作的函数(以保持我的主文件整洁和整洁)。在这里,在保存相应句柄中的所有数据后,我调用guidata(hObject, handles)
来保存我的更改。
但是,在函数之外,在回调中,每当我调用display(handle.data)
时,它都会在我调用回调之前显示句柄,尽管我刷新了它。现在直接在回调中调用另一个guidata(hObject, handles)
并不会改变一件事,但如果我调用handles = guidata(hObject)
它就可以了。
我的问题:为什么?它只是MATLAB吗?
CODE:
func_addWaypoint(hObject, handles)
display(handles.cart_coords)
handles = guidata(hObject);
display(handles.free_coords)
注意:第一个display()
给我旧数据,第二个给我新数据。
这是我的功能:
function func_addWaypoint(hObject,handles)
new_waypoint = nan(3,2);
coord_constraint = ones(3,2);
new_waypoint(1,1) = str2double(handles.edit_start_x1.String);
new_waypoint(2,1) = str2double(handles.edit_start_x2.String);
new_waypoint(3,1) = str2double(handles.edit_start_x3.String);
new_waypoint(1,2) = str2double(handles.edit_stop_x1.String);
new_waypoint(2,2) = str2double(handles.edit_stop_x2.String);
new_waypoint(3,2) = str2double(handles.edit_stop_x3.String);
v
for i = 1:numel(new_waypoint)
if isnan(new_waypoint(i))
new_waypoint(i) = rand() * 2 - 1;
coord_constraint(i) = 0;
end
end
handles.cart_coords = [handles.cart_coords, new_waypoint];
handles.free_coords = [handles.free_coords, coord_constraint];
guidata(hObject, handles);
答案 0 :(得分:0)
实际上,变量handles
有两个副本:一个存在于函数func_addWaypoint
的{{3}} 外中,一个存在于内 func_addWaypoint
的工作空间。当您调用该函数时,函数外部变量的数据将被复制到函数内部的变量(workspace)。
您对函数中的handles
变量进行了修改,然后使用hObject
将修改后的版本附加到guidata(hObject, handles);
。但是,函数工作区外部中存在的原始handles
变量仍具有未修改的数据。当您使用hObject
提取时,此变量会被附加到handles = guidata(hObject);
的新值覆盖。
答案 1 :(得分:0)
guidata(object_handle,data)将变量数据与对象一起存储 由object_handle指定。
VS
data = guidata(object_handle)返回先前存储的数据,或者 如果没有存储空矩阵。
基本上,如果您修改handles
结构中的任何内容,请确保在退出该功能之前调用guidata(hObject,handles)
。
同样,如果您依赖于在其他地方修改过的句柄中的自定义信息,请在函数顶部调用handles = guidata(jObject)
。
否则你会遇到一些问题,比如你在哪里看到你可能有handles
结构的旧副本