setappdata/getappdata 将在下面详细讨论。
如 cmets 中所述,您可以使用 setappdata(0, ... / getappdata(0, ... 向根对象分配/读取数据。
摘自MATLAB User Interfaces - Passing Data Around User Interface。原作者是Suever 和Hoki。归属细节可以在contributor page 上找到。该源在CC BY-SA 3.0 下获得许可,可以在Documentation archive 中找到。参考主题 ID:2883 和示例 ID:9775。
在用户界面中传递数据
大多数高级用户界面都要求用户能够在构成用户界面的各种功能之间传递信息。 MATLAB 有许多不同的方法可以做到这一点。
MATLAB 自己的 GUI Development Environment (GUIDE) 更喜欢使用名为 handles 的 struct 在回调之间传递数据。这个struct 包含各种 UI 组件的所有图形句柄以及用户指定的数据。如果您没有使用 GUIDE 创建的自动传递 handles 的回调,您可以使用 guidata 检索当前值
% hObject is a graphics handle to any UI component in your GUI
handles = guidata(hObject);
如果您想修改存储在此数据结构中的值,您可以进行修改,但您必须将其存储回 hObject 中,以便其他回调可以看到更改。您可以通过为guidata 指定第二个输入参数来存储它。
% Update the value
handles.myValue = 2;
% Save changes
guidata(hObject, handles)
hObject 的值无关紧要,只要它是一个 UI 组件在同一个 figure 内,因为最终数据存储在包含 hObject 的图形中。 p>
最适合:
- 存储
handles 结构,您可以在其中存储所有
您的 GUI 组件的句柄。
- 存储需要被大多数回调访问的“小”其他变量。
不推荐用于:
- 存储并非所有人都必须访问的大型变量
回调和子函数(使用
setappdata/getappdata
这些)。
与guidata 方法类似,您可以使用setappdata 和getappdata 在图形句柄中存储和检索值。使用这些方法的优点是您可以仅检索您想要的值,而不是包含所有存储数据的整个struct。它类似于键/值存储。
在图形对象中存储数据
% Create some data you would like to store
myvalue = 2
% Store it using the key 'mykey'
setappdata(hObject, 'mykey', myvalue)
并从不同的回调中检索相同的值
value = getappdata(hObject, 'mykey');
注意:如果在调用getappdata之前没有存储任何值,它将返回一个空数组([])。
类似于guidata,数据存储在包含hObject的图中。
最适合:
- 存储并非所有人都必须访问的大型变量
回调和子函数。
每个图形句柄都有一个特殊的属性UserData,它可以包含您想要的任何数据。它可以包含一个元胞数组、一个struct,甚至是一个标量。您可以利用此属性并在此字段中存储您希望与给定图形句柄关联的任何数据。如果您使用的是 R2014b 或更新版本,您可以使用图形对象的标准 get/set 方法或点表示法保存和检索值。
% Create some data to store
mydata = {1, 2, 3};
% Store it within the UserData property
set(hObject, 'UserData', mydata)
% Of if you're using R2014b or newer:
% hObject.UserData = mydata;
然后在另一个回调中,您可以检索此数据:
their_data = get(hObject, 'UserData');
% Or if you're using R2014b or newer:
% their_data = hObject.UserData;
最适合:
- 存储范围有限的变量(变量可能仅由存储它们的对象或与其有直接关系的对象使用)。
在 MATLAB 中,嵌套函数可以读取和修改父函数中定义的任何变量。这样,如果将回调指定为嵌套函数,它就可以检索和修改存储在主函数中的任何数据。
function mygui()
hButton = uicontrol('String', 'Click Me', 'Callback', @callback);
% Create a counter to keep track of the number of times the button is clicked
nClicks = 0;
% Callback function is nested and can therefore read and modify nClicks
function callback(source, event)
% Increment the number of clicks
nClicks = nClicks + 1;
% Print the number of clicks so far
fprintf('Number of clicks: %d\n', nClicks);
end
end
最适合:
- 小而简单的图形用户界面。 (为了快速制作原型,不必实现
guidata 和/或 set/getappdata 方法)。
不推荐用于:
中型、大型或复杂的 GUI。
使用GUIDE 创建的GUI。
显式输入参数
如果您需要将数据发送到回调函数并且不需要在回调中修改数据,您始终可以考虑使用精心设计的回调定义将数据传递给回调。
您可以使用添加输入的匿名函数
% Create some data to send to mycallback
data = [1, 2, 3];
% Pass data as a third input to mycallback
set(hObject, 'Callback', @(source, event)mycallback(source, event, data))
或者您可以使用元胞数组语法来指定回调,再次指定额外的输入。
set(hObject, 'Callback', {@mycallback, data})
最适合:
- 当回调需要data 执行某些操作但data 变量不需要修改并保存为新状态时。