guidata(hObject, handles) 和 handles = guidata(hObject) 有什么区别?

What is the difference between guidata(hObject, handles) and handles = guidata(hObject)?

基本同上

在我的 MATLAB GUI 中,我有一个按钮,它从文本框中检索数据并将其保存在数组句柄中(更具体地说是多个 waypoints)。我在后期使用这个矩阵,所以我需要将数据存储在句柄中。

在回调函数中,我调用了另一个执行此操作的函数(以保持我的主文件整洁)。在这里,在保存了相应句柄中的所有数据后,我调用guidata(hObject, handles)来保存我的更改。

然而,在函数之外,在回调中,每当我调用 display(handle.data) 时,它都会显示我调用回调之前的句柄,尽管我刷新了它。现在直接在回调中调用另一个 guidata(hObject, handles) 不会改变任何事情,但如果我调用 handles = guidata(hObject) 它会起作用。

我的问题:为什么?只是 MATLAB 吗?

代码:

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);

你的变量 handles 实际上有两个副本:一个存在于 workspace outside of the function func_addWaypoint, and one exists within the workspace of func_addWaypoint. When you call the function, the data from the variable outside the function gets copied to the variable inside the function (caveat).

您在 函数中对 handles 变量 进行修改,然后使用 guidata(hObject, handles); 将修改后的版本附加到 hObject。但是,函数的工作区外部中存在的原始handles变量仍然具有未修改的数据。当您使用 handles = guidata(hObject);.

获取它们时,此变量将被附加到 hObject 的新值覆盖

Documentation for guidata

guidata(object_handle,data) stores the variable data with the object specified by object_handle.

data = guidata(object_handle) returns previously stored data, or an empty matrix if nothing is stored.

基本上,如果您修改 handles 结构中的任何内容,请确保在退出函数之前调用 guidata(hObject,handles)

同样,如果您依赖于在其他地方修改过的句柄中的自定义信息,请在您的函数顶部调用 handles = guidata(jObject)

否则你会 运行 遇到问题,比如你看到你可能有 handles 结构的旧副本