GUI MATLAB 句柄的结构
Structure of handles of GUIs MATLAB
我在 MATLAB 中有三个 GUI。他们每个人的标签是'P0'
、'P1'
和'P2'
。我想将所有三个 GUI 的句柄放在一个结构中,并能够从三个 GUI 中的任何一个访问该结构并更新其中的值。实现此目标的最佳方法是什么?
关于如何执行此操作,您有几个选项。一种方法是使用根图形对象以及 setappdata
和 getappdata
来存储和检索值。
fig0 = findall(0, 'tag', 'P0');
fig1 = findall(0, 'tag', 'P1');
fig2 = findall(0, 'tag', 'P2');
% Combine the GUIdata into a single struct
handles.P0 = guidata(fig0);
handles.P1 = guidata(fig1);
handles.P2 = guidata(fig2);
% Store this struct in the root object where ALL GUIs can access it
setappdata(0, 'myappdata', handles);
然后从你的回调中,你只需获取这个结构并直接使用它
function mycallback(hObject, evnt, ~)
% Ignore the handles that is passed in and use your own
handles = getappdata(0, 'myappdata');
% Now if you modify it, you MUST save it again
handles.P0.value = 1;
setappdata(0, 'myappdata', handles)
end
另一种选择是使用 handle
class 来存储您的值,然后您可以将 reference 存储到 handles
每个 GUI 的结构。当您对此结构进行更改时,更改将反映在所有 GUI 中。
一种简单的方法是使用 structobj
(免责声明:我是开发人员),它将任何 struct
转换为 handle
对象。
% Create an object that looks like a struct but is a handle class and fill it with the
% handles struct from each GUI
handles = structobj(guidata(fig0));
update(handles, guidata(fig1));
update(handles, guidata(fig2));
% Now store this in the guidata of each figure
guidata([fig0, fig1, fig2], handles)
由于我们在图中的 guidata
中存储了一个东西,它会通过标准 handles
输入参数自动传递给您的回调。所以现在你的回调看起来像:
function mycallback(hObject, evnt, handles)
% Access the data you had stored
old_thing = handles.your_thing;
% Update the value (changes will propagate across ALL GUIs)
handles.your_thing = 2;
end
这种方法的好处是您可以同时拥有三个 GUI 运行 的多个实例,并且数据不会相互干扰。
我在 MATLAB 中有三个 GUI。他们每个人的标签是'P0'
、'P1'
和'P2'
。我想将所有三个 GUI 的句柄放在一个结构中,并能够从三个 GUI 中的任何一个访问该结构并更新其中的值。实现此目标的最佳方法是什么?
关于如何执行此操作,您有几个选项。一种方法是使用根图形对象以及 setappdata
和 getappdata
来存储和检索值。
fig0 = findall(0, 'tag', 'P0');
fig1 = findall(0, 'tag', 'P1');
fig2 = findall(0, 'tag', 'P2');
% Combine the GUIdata into a single struct
handles.P0 = guidata(fig0);
handles.P1 = guidata(fig1);
handles.P2 = guidata(fig2);
% Store this struct in the root object where ALL GUIs can access it
setappdata(0, 'myappdata', handles);
然后从你的回调中,你只需获取这个结构并直接使用它
function mycallback(hObject, evnt, ~)
% Ignore the handles that is passed in and use your own
handles = getappdata(0, 'myappdata');
% Now if you modify it, you MUST save it again
handles.P0.value = 1;
setappdata(0, 'myappdata', handles)
end
另一种选择是使用 handle
class 来存储您的值,然后您可以将 reference 存储到 handles
每个 GUI 的结构。当您对此结构进行更改时,更改将反映在所有 GUI 中。
一种简单的方法是使用 structobj
(免责声明:我是开发人员),它将任何 struct
转换为 handle
对象。
% Create an object that looks like a struct but is a handle class and fill it with the
% handles struct from each GUI
handles = structobj(guidata(fig0));
update(handles, guidata(fig1));
update(handles, guidata(fig2));
% Now store this in the guidata of each figure
guidata([fig0, fig1, fig2], handles)
由于我们在图中的 guidata
中存储了一个东西,它会通过标准 handles
输入参数自动传递给您的回调。所以现在你的回调看起来像:
function mycallback(hObject, evnt, handles)
% Access the data you had stored
old_thing = handles.your_thing;
% Update the value (changes will propagate across ALL GUIs)
handles.your_thing = 2;
end
这种方法的好处是您可以同时拥有三个 GUI 运行 的多个实例,并且数据不会相互干扰。