假设我在MATLAB GUI上有两个按钮。当我按下pushMain时,我想调用pushChild按钮的回调。
function pushChild_Callback(hObject, eventdata, handles)
handles.A = 1;
guidata(hObject,handles);
function pushMain_Callback(hObject, eventdata, handles)
handles.B = 2;
pushChild_Callback(handles.pushChild, eventdata, handles) % option 1
pushChild_Callback(hObject, eventdata, handles) % option 2
guidata(hObject,handles);
在这两个选项中,当我按下pushMain按钮时,它都会进入pushChild_Callback函数。但是,它不会保存 handles.A 的值。离开pushChild_Callback函数后,handles.A变成空的,就像我之前从未填充过它一样。因此,我将该问题与pushChild_Callback函数中的 guidata 命令关联。它不会将手柄保存到正确的位置。
答案 0 :(得分:0)
将句柄数据保存在pushMain_Callback
中时,将覆盖handles
对pushChild_Callback
所做的更改。这是因为MATLAB正在按值而不是通过引用存储handles
。调用pushChild_Callback
时,仅在此函数的范围内设置handles.A
的值。当您返回到pushMain_Callback
的范围时,句柄的本地副本没有任何值handles.A
。因此,当您在guidata(hObject,handles)
中调用pushMain_Callback
时,将用未设置handles
的版本覆盖handles.A
。
调用子函数后,需要刷新handles
数据。我建议如下:
function pushChild_Callback(hObject, eventdata, handles)
handles.A = 1;
guidata(hObject,handles);
function pushMain_Callback(hObject, eventdata, handles)
handles.B = 2;
pushChild_Callback(hObject, eventdata, handles)
handles = guidata(hOject);
编辑:
基本上,guidata(hObject,handles)
是 write 命令,将handles
的值写入hObject
结构。 handles = guidata(hObject)
是 read 命令-它读取存储在hObject
中的数据并将其存储在变量handles
中。我将尝试逐步解释发生的情况。
第一次调用pushMain
时,handles.B
设置为2,变量的状态如下所示:
pushMain: handles = {A = [], B = 2}
hObject: handles = {A = [], B = []}
pushChild: handles = {A = [], B = []}
调用pushChild
时,您将其从handles
传递到pushMain
对象,因此最初看起来像这样:
pushMain: handles = {A = [], B = 2}
hObject: handles = {A = [], B = []}
pushChild: handles = {A = [], B = 2}
然后,handles.A
设置为1。这仅更新handles
中pushChild
的值-pushMain
不受影响,因为其范围不同:>
pushMain: handles = {A = [], B = 2}
hObject: handles = {A = [], B = []}
pushChild: handles = {A = 1, B = 2}
然后我们调用guidata(hObject,handles)
,它更新了handles
存储的hObject
的值:
pushMain: handles = {A = [], B = 2}
hObject: handles = {A = 1, B = 2}
pushChild: handles = {A = 1, B = 2}
控制权现在传回到pushMain
。请注意,handles
中的pushMain
的值没有被更新,因此handles.A
仍然为空。这意味着如果要调用guidata(hObject,handles)
,我们将设置hObject.handles.A = []
,这显然不是我们想要的。相反,我们必须通过调用handles
来更新handles = guidata(hObject)
的值。因此:
pushMain: handles = {A = 1, B = 2}
hObject: handles = {A = 1, B = 2}
pushChild: handles = {A = 1, B = 2}