在 MATLAB GUI 中按下另一个按钮时如何调用按钮的回调?

我不这么认为

假设我在 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,你要覆盖所做的更改handlespushChild_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)是一个写入命令,写入的值handleshObject结构。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。这仅更新handlespushChild--的值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. 需要注意的是价值handlespushMain已经没有更新,所以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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章