假设我在 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 变得空了,就像我以前从未填充过它一样。因此,我的问题联系起来guidata命令这是在pushChild_Callback功能。它不会将手柄保存到正确的位置。
当您保存在处理数据pushMain_Callback
,你要覆盖所做的更改handles
的pushChild_Callback
。这是因为 MATLABhandles
按值存储,而不是按引用存储。当您调用 时pushChild_Callback
,您handles.A
仅在此函数的范围内设置了 的值。当您返回到 的作用域时pushMain_Callback
,句柄的本地副本没有任何值handles.A
。因此,当您调用guidata(hObject,handles)
inside 时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)
是一个写入命令,写入的值handles
的hObject
结构。handles = guidata(hObject)
是一个读取命令——它读取存储在其中的数据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}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句