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

时间:2019-02-19 07:57:54

标签: matlab user-interface

假设我在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 命令关联。它不会将手柄保存到正确的位置。

1 个答案:

答案 0 :(得分:0)

将句柄数据保存在pushMain_Callback中时,将覆盖handlespushChild_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。这仅更新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。请注意,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}
相关问题