在回调函数之间共享数据
数据共享技术概述
许多应用程序包含相互依赖的控件、菜单和图形对象。因为每个回调函数都有自己的作用域,所以必须显式地与应用程序中需要访问它的部分共享数据。下表描述了在应用程序中共享数据的几种不同方法。
方法 | 描述 | 要求和权衡 |
---|---|---|
将数据存储在UserData或其他对象属性中 | 直接通过组件对象查询或存储属性值。 所有的UI组件都有一个 |
|
将数据存储为应用程序数据 | 方法将数据与特定组件关联 |
|
创建嵌套回调函数(编程应用程序) | 将回调函数嵌套在主函数中。这使回调函数可以访问主函数中的所有变量。 |
|
使用guidata函数存储数据 | 控件与图形窗口共享数据 |
|
将数据存储在UserData或其他对象属性中
UI组件的属性中包含有用的信息。例如,您可以通过查询滑块来找到滑块的当前位置价值
财产。此外,所有组件都有一个用户数据
属性,它可以存储任何MATLAB变量。所有回调函数都可以访问存储在用户数据
属性,只要这些函数可以访问组件。
在程序创建的应用程序中共享用户数据
使用点表示法,组件.propertyname
,以编程方式存储或检索属性值。点表示法在R2014b和以后的版本中都适用。这段代码查询和修改图形的名称。
Hfig =图;figame = hfig.Name;hfig。Name = 'My Window';
得到
和集
功能:Hfig =图;figame = get(hfig,'Name');集(hfig,“名字”,“我的窗户”);
如果您的代码不能直接访问组件,请使用findobj
函数搜索该组件。如果搜索成功,findobj
将组件作为输出返回。然后可以访问组件的属性。
下面的应用程序代码使用用户数据
属性共享关于滑块的信息。要查看其工作原理,请将此代码复制并粘贴到编辑器中并运行它。
函数My_slider () hfig = figure();滑块= uicontrol(“父”hfig,“风格”,“滑块”,...“单位”,“归一化”,...“位置”,[0.3 0.5 0.4 0.1],...“标签”,“slider1”,...“用户数据”结构(“val”0,“diffMax”1),...“回调”, @slider_callback);按钮= uicontrol(“父”hfig,“风格”,“按钮”,...“单位”,“归一化”,...“位置”,[0.4 0.3 0.2 0.1],...“字符串”,显示不同的,...“回调”, @button_callback);结束函数slider_callback(hObject,eventdata) sval = hObject. value;diffMax = hObject。Max - sval;数据= struct(“val”sval,“diffMax”, diffMax);hObject。用户数据= data;%对于R2014a及更早版本:% sval = get(hObject,'Value');% maxval = get(hObject,'Max');% diffMax = maxval - sval;% data = struct('val',sval,'diffMax',diffMax);%设置(hObject,用户数据,数据);结束函数button (hObject,eventdata) h = findobj(“标签”,“slider1”);data = h.UserData;%对于R2014a及更早版本:% data = get(h,'UserData');显示([数据。瓦尔数据。diffMax]);结束
slider_callback
使用这些命令在结构中存储数据:
data = struct('val',sval,'diffMax',diffMax)
存储值,sval
和diffMax
,在一个叫做数据
.hObject。用户数据= data
的值。数据
在用户数据
属性。
当用户单击按钮时,button_callback
使用这些命令来检索数据:
h = findobj('Tag','slider1')
查找滑块组件。data = h.UserData
获取滑块的值用户数据
财产。
在GUIDE应用程序中共享用户数据
设置一个GUIDE应用程序来共享滑块数据用户数据
属性,执行以下步骤:
在命令窗口中,键入
指南
.在“GUIDE快速入门”对话框中,选择空白GUI(默认).然后,单击好吧.
在组件面板中显示UI组件的名称:
选择文件>首选项>指南.
选择在组件面板中显示名称.
点击好吧.
从布局编辑器左侧的组件面板中选择按钮工具,并将其拖到布局区域中。
从布局编辑器左侧的组件面板中选择滑块工具,并将其拖到布局区域中。
选择文件>保存.将UI保存为
myslider.fig
.MATLAB在编辑器中打开代码文件。的初始值
用户数据
开函数的性质,myslider_OpeningFcn
.这个函数在UI对用户可见之前执行。在
myslider_OpeningFcn
,在命令之后插入这些命令,句柄。output = hObject
.数据= struct(“val”0,“diffMax”1);集(handles.slider1,“用户数据”、数据);
myslider_OpeningFcn
就像这样。函数myslider_OpeningFcn(hObject, eventdata, handles, varargin)此函数没有输出参数,参见OutputFcn。将句柄添加到图中事件数据保留-将在MATLAB的未来版本中定义带有句柄和用户数据的%句柄结构(参见GUIDATA)% varargin命令行参数为垃圾(参见varargin)选择myslider的默认命令行输出句柄。output = hObject;数据= struct(“val”0,“diffMax”1);集(handles.slider1,“用户数据”、数据);%更新句柄结构guidata (hObject处理);UIWAIT使myslider等待用户响应% uiwait (handles.figure1);
处理
输入参数是myslider_OpeningFcn
.的处理
variable是一个包含UI中所有组件的结构。该结构中的每个字段都对应于一个单独的组件。的每个字段名都匹配标签
对应组件的属性。因此,handles.slider1
是这个UI中的滑块组件。的命令,集(handles.slider1,用户数据,数据)
存储变量,数据
,在用户数据
属性。向滑块回调添加修改数据的代码。将这些命令添加到函数的末尾,
slider1_Callback
.maxval = get(hObject,“马克斯”);sval = get(hObject,“价值”);diffMax = maxval - sval;data = get(hObject,“用户数据”);数据。瓦尔= sval; data.diffMax = diffMax;将数据存储在滑块的UserData中集(hObject,“用户数据”、数据);
slider1_Callback
就像这样。%——在滑块移动时执行。函数slider1_Callback(hObject, eventdata, handles)hoject句柄到slider1(参见GCBO)事件数据保留-将在MATLAB的未来版本中定义带有句柄和用户数据的%句柄结构(参见GUIDATA)get(hObject,'Value')返回滑块的位置get(hObject,'Min')和get(hObject,'Max')来确定滑块的范围maxval = get(hObject,“马克斯”);sval = get(hObject,“价值”);diffMax = maxval - sval;data = get(hObject,“用户数据”);数据。瓦尔= sval; data.diffMax = diffMax;将数据存储在滑块的UserData中集(hObject,“用户数据”、数据);
hObject
的输入参数slider1_Callback
函数。hObject
总是触发回调的组件(在本例中是滑块)。因此,集(hObject,用户数据,数据)
,存储数据
变量用户数据
属性。向按钮回调添加代码以检索数据。将这些命令添加到函数的末尾,
pushbutton1_Callback
.从滑块获取用户数据Data = get(handles.slider1,“用户数据”);Currentval = data.val;diffmax = data.diffMax;显示([currentval diffval]);
pushbutton1_Callback
就像这样。%——在按下pushbutton1中的按钮时执行。函数(hoject, eventdata, handles)hoject句柄到pushbutton1(参见GCBO)事件数据保留-将在MATLAB的未来版本中定义带有句柄和用户数据的%句柄结构(参见GUIDATA)从滑块获取用户数据Data = get(handles.slider1,“用户数据”);Currentval = data.val;diffmax = data.diffMax;显示([currentval diffval]);
这段代码使用handles结构来访问滑块。的命令,
data = get(handles.slider1,'UserData')
,获取滑块的用户数据
财产。然后,显示
函数显示所存储的值。按下保存代码保存在编辑器工具条中。
将数据存储为应用程序数据
要存储应用程序数据,请调用setappdata
功能:
setappdata (obj,名称,值);
obj
,是用于存储数据的组件对象。第二个输入,的名字
,是用于描述值的友好名称。第三个输入,价值
,是您想要存储的值。
要检索应用程序数据,请使用getappdata
功能:
Data = getappdata(obj,name);
obj
,必须是包含数据的组件对象。第二个输入,的名字
,必须与用于存储数据的名称匹配。不像用户数据
属性,该属性只包含一个变量,您可以使用setappdata
存储多个变量。
在程序创建的应用程序中共享应用程序数据
这个应用程序使用应用程序数据共享两个值。要查看其工作原理,请将此代码复制并粘贴到编辑器中并运行它。
函数My_slider () hfig = figure();setappdata (hfig“slidervalue”, 0);setappdata (hfig“差异”1);滑块= uicontrol(“父”hfig,“风格”,“滑块”,...“单位”,“归一化”,...“位置”,[0.3 0.5 0.4 0.1],...“标签”,“slider1”,...“回调”, @slider_callback);按钮= uicontrol(“父”hfig,“风格”,“按钮”,...“单位”,“归一化”,...“位置”,[0.4 0.3 0.2 0.1],...“字符串”,“显示值”,...“回调”, @button_callback);结束函数slider_callback(hObject,eventdata) diffMax = hObject。Max - hObject.Value;setappdata (hObject。父母,“slidervalue”, hObject.Value);setappdata (hObject。父母,“差异”, diffMax);%对于R2014a及更早版本:% maxval = get(hObject,'Max');% curval = get(hObject,'Value');% diffMax = maxval -曲线;% parentfig = get(hObject,'Parent');% setappdata (parentfig, slidervalue, currval);% setappdata (parentfig‘差异’,diffMax);结束函数button_callback(hObject,eventdata) currentval = getappdata(hObject,eventdata)父母,“slidervalue”);diffval = getappdata(hObject. data)父母,“差异”);%对于R2014a及更早版本:% parentfig = get(hObject,'Parent');% currentval = getappdata(parentfig,'slidervalue');% diffval = getappdata(parentfig,'difference');显示([currentval diffval]);结束
slider_callback
函数计算diffMax
.然后,它使用以下命令修改应用程序数据:
setappdata (hObject.Parent slidervalue, hObject.Value)
在图中使用名称存储当前滑块值,“slidervalue”
.在这种情况下,hObject。父
是图。setappdata (parentfig‘差异’,diffMax)
商店diffMax
在使用名称的图中,“差异”
.
当用户单击按钮时,button_callback
函数使用以下命令检索数据:
currentval = getappdata(hObject.Parent,'slidervalue')
从图中检索当前滑块值。在这种情况下,hObject。父
是图。diffval = getappdata(hObject.Parent,'difference')
从图中检索差值。
在GUIDE应用程序中共享应用程序数据
要设置一个GUIDE应用程序来共享应用程序数据,请执行以下步骤:
在命令窗口中,键入
指南
.在“GUIDE快速入门”对话框中,选择空白GUI(默认).然后,单击好吧.
在组件面板中显示UI组件的名称:
选择文件>首选项>指南.
选择在组件面板中显示名称.
点击好吧.
从布局编辑器左侧的组件面板中选择按钮工具,并将其拖到布局区域中。
从布局编辑器左侧的组件面板中选择滑块工具,并将其拖到布局区域中。
选择文件>保存.将UI保存为
myslider.fig
.MATLAB在编辑器中打开代码文件。在打开函数中设置应用程序数据的初始值,
myslider_OpeningFcn
.这个函数在UI对用户可见之前执行。在myslider_OpeningFcn
,在命令之后插入这些命令,句柄。output = hObject
.setappdata (handles.figure1“slidervalue”, 0);setappdata (handles.figure1“差异”1);
myslider_OpeningFcn
就像这样。函数myslider_OpeningFcn (hObject eventdata处理,变长度输入宗量)此函数没有输出参数,参见OutputFcn。将句柄添加到图中事件数据保留-将在MATLAB的未来版本中定义带有句柄和用户数据的%句柄结构(参见GUIDATA)% varargin命令行参数为垃圾(参见varargin)%为垃圾选择默认命令行输出句柄。output = hObject;setappdata (handles.figure1“slidervalue”, 0);setappdata (handles.figure1“差异”1);%更新句柄结构guidata (hObject处理);% UIWAIT让垃圾等待用户响应(参见UIRESUME)% uiwait (handles.figure1);
处理
输入参数是myslider_OpeningFcn
.的处理
variable是一个包含UI中所有组件的结构。该结构中的每个字段都对应于一个单独的组件。的每个字段名都匹配标签
对应组件的属性。在这种情况下,handles.figure1
是图形对象。因此,setappdata
可以使用此图形对象存储数据。向滑块回调添加更改数据的代码。将这些命令添加到函数的末尾,
slider1_Callback
.maxval = get(hObject,“马克斯”);曲线= get(hObject,“价值”);diffMax = maxval -曲线;%存储应用程序数据setappdata (handles.figure1“slidervalue”, currval);setappdata (handles.figure1“差异”, diffMax);
slider1_Callback
就像这样。函数slider1_Callback(hObject, eventdata, handles)hoject句柄到slider1(参见GCBO)事件数据保留-将在MATLAB的未来版本中定义带有句柄和用户数据的%句柄结构(参见GUIDATA)get(hObject,'Value')返回滑块的位置get(hObject,'Min')和get(hObject,'Max')来确定滑块的范围maxval = get(hObject,“马克斯”);曲线= get(hObject,“价值”);diffMax = maxval -曲线;%存储应用程序数据setappdata (handles.figure1“slidervalue”, currval);setappdata (handles.figure1“差异”, diffMax);
处理
结构,所以setappdata
命令将数据存储在handles.figure1
.向按钮回调添加代码以检索数据。将这些命令添加到函数的末尾,
pushbutton1_Callback
.检索应用程序数据Currentval = getappdata(handles.figure1,“slidervalue”);Diffval = getappdata(handles.figure1,“差异”);显示([currentval diffval]);
pushbutton1_Callback
就像这样。%——在按下pushbutton1中的按钮时执行。函数(hoject, eventdata, handles)hoject句柄到pushbutton1(参见GCBO)事件数据保留-将在MATLAB的未来版本中定义带有句柄和用户数据的%句柄结构(参见GUIDATA)检索应用程序数据Currentval = getappdata(handles.figure1,“slidervalue”);Diffval = getappdata(handles.figure1,“差异”);显示([currentval diffval]);
处理
结构,所以getappdata
的命令检索数据handles.figure1
.按下保存代码保存在编辑器工具条中。
创建嵌套回调函数(编程应用程序)
你可以在编程应用程序的主函数中嵌套回调函数。当你这样做时,嵌套回调函数与主函数共享一个工作空间。因此,嵌套函数可以访问主函数中定义的所有UI组件和变量。下面的示例代码使用嵌套函数来共享关于滑块位置的数据。要查看其工作原理,请将此代码复制并粘贴到编辑器中并运行它。
函数My_slider () hfig = figure();数据= struct(“val”0,“diffMax”1);滑块= uicontrol(“父”hfig,“风格”,“滑块”,...“单位”,“归一化”,...“位置”,[0.3 0.5 0.4 0.1],...“标签”,“slider1”,...“回调”, @slider_callback);按钮= uicontrol(“父”hfig,“风格”,“按钮”,...“单位”,“归一化”,...“位置”,[0.4 0.3 0.2 0.1],...“字符串”,显示不同的,...“回调”, @button_callback);函数slider_callback(hObject,eventdata) sval = hObject. value;diffMax = hObject。Max - sval;%对于R2014a及更早版本:% sval = get(hObject,'Value');% maxval = get(hObject,'Max');% diffMax = maxval - sval;数据。瓦尔= sval; data.diffMax = diffMax;结束函数button_callback (hObject eventdata)显示([数据。val data.diffMax]);结束结束
结构体
数组被称为数据
.当用户移动滑块时,slider_callback
函数更新瓦尔
和diffMax
的字段数据
结构。当终端用户单击按钮时,将button_callback
函数显示存储在数据
.
注意:GUIDE应用程序不建议使用嵌套函数。 |
使用guidata函数存储数据
的guidata
函数提供了一种与图形窗口共享数据的方法。可以在任何回调函数中存储或检索数据hObject
组件。这意味着,不像和用户数据
或应用程序数据,您不需要访问一个特定的组件来设置或查询数据。调用guidata
有两个输入参数来存储数据:
guidata (object_handle、数据);
object_handle
,是任何UI组件(通常hObject
).第二个输入,数据
,是要存储的变量。每次你打来电话guidata
使用两个输入参数,MATLAB会覆盖之前存储的任何数据。这意味着您一次只能存储一个变量。如果希望共享多个值,则将数据存储为结构体
数组或单元格数组。
要检索数据,请调用guidata
使用一个输入参数和一个输出参数:
Data = guidata(object_handle);
如果您的数据存储为结构体
数组或单元格数组,并且你想在不改变其他元素的情况下更新一个元素,然后检索数据并用修改过的数组替换它:
data = guidata(hObject);数据。Myvalue = 2;guidata (hObject、数据);
在以编程方式创建的应用中使用指南数据
使用guidata
在程序应用程序中,将带有一些初始值的数据存储在main函数中。然后可以在任何回调函数中检索和修改数据。
下面的代码是一个编程应用程序的简单示例,它使用guidata
共享包含两个字段的结构。要查看其工作原理,请将此代码复制并粘贴到编辑器中并运行它。
函数My_slider () hfig = figure();guidata (hfig、结构(“val”0,“diffMax”1));滑块= uicontrol(“父”hfig,“风格”,“滑块”,...“单位”,“归一化”,...“位置”,[0.3 0.5 0.4 0.1],...“标签”,“slider1”,...“回调”, @slider_callback);按钮= uicontrol(“父”hfig,“风格”,“按钮”,...“单位”,“归一化”,...“位置”,[0.4 0.3 0.2 0.1],...“字符串”,“显示值”,...“回调”, @button_callback);结束函数slider_callback(hObject,eventdata) data = guidata(hObject);数据。瓦尔= hObject.Value; data.diffMax = hObject.Max - data.val;%对于R2014a及更早版本:%的数据。瓦尔= get(hObject,'Value');% maxval = get(hObject,'Max');%的数据。diffMax= maxval - data.val;guidata (hObject、数据);结束函数button_callback(hObject,eventdata) data = guidata(hObject);显示([数据。瓦尔数据。diffMax]);结束
slider_callback
函数执行以下命令来检索和修改存储的数据:
data = guidata(hObject)
以结构形式检索存储的数据。数据。diffMax = maxval - data.val
修改diffMax
结构中的字段。guidata (hObject、数据)
存储修改后的结构。
当用户单击按钮时,button_callback
函数调用guidata
检索所存储结构的副本。然后它显示存储在结构中的两个值。
在指南应用程序中使用指南数据
GUIDE使用guidata
函数来存储名为处理
,其中包含所有的UI组件。MATLAB通过处理
数组到每个回调函数。如果你想用guidata
要共享其他数据,请将字段添加到处理
结构在开放功能。打开函数是定义在代码文件顶部附近的函数,该函数具有_OpeningFcn
在名字上。
要修改回调函数中的数据,请修改处理
结构,然后使用guidata
函数。这个滑块回调函数显示了如何修改和存储处理
结构在GUIDE回调函数中。
函数slider1_Callback (hObject eventdata处理)hoject句柄到slider1(参见GCBO)事件数据保留-将在MATLAB的未来版本中定义带有句柄和用户数据的%句柄结构(参见GUIDATA)get(hObject,'Value')返回滑块的位置get(hObject,'Min')和get(hObject,'Max')确定范围句柄。Myvalue = 2;guidata (hObject处理);结束
示例:共享滑块数据使用guidata
这是一个预先构建的GUIDE应用程序,它使用guidata
函数在滑动条和文本字段之间共享数据。当您移动滑块时,文本字段中显示的数字将更改以显示新的滑块位置。
要在GUIDE中打开示例,请单击开放的例子按钮。要运行该应用程序,请单击绿色按钮跑图按钮在GUIDE窗口的顶部。
示例:在两个应用程序之间共享数据
这是一个预先构建的GUIDE应用程序,它使用应用程序数据和guidata
函数在两个对话框之间共享数据。当您在第二个对话框中输入文本并单击好吧,按钮标签在第一个对话框中更改。
要在GUIDE中打开示例,请单击开放的例子按钮。要运行该应用程序,请单击绿色按钮跑图按钮在GUIDE窗口的顶部。
在changeme_main.m
,buttonChangeMe_Callback
函数执行此命令显示第二个对话框:
changeme_dialog (changeme_main, handles.figure)
的handles.figure
输入参数是数字
对象的changeme_main对话框。
的changeme_dialog
函数检索处理
的结构。数字
对象。因此,整个组件集合在changeme_main对话框可用于第二个对话框。
示例:在三个应用程序之间共享数据
这是一个预先构建的GUIDE应用程序,它使用guidata
和用户数据
在三个应用程序窗口之间共享数据。大窗口是一个图标编辑器,它接受来自工具面板和调色板窗口的信息。
要在GUIDE中打开示例,请单击开放的例子按钮。要运行该应用程序,请单击绿色按钮跑图按钮在GUIDE窗口的顶部。
在guide_inconeditor.m
,函数guide_iconeditor_OpeningFcn
包含该命令:
colorPalette = guide_colorpalette('iconEditor', hObject)
论点如下:
“iconEditor”
对象中的回调函数guide_iconEditor窗口触发函数的执行。hObject
是数字
对象的guide_iconEditor窗口。colorPalette
是数字
对象的guide_colorPalette窗口。
同样的,guide_iconeditor_OpeningFcn
调用guide_toolpalette
具有类似输入和输出参数的函数。
通过数字
对象之间的guide_iconEditor窗口来访问处理
另外两个窗口的结构。同样,其他两个窗口可以访问处理
的结构guide_iconEditor窗口。