文档

在回调函数之间共享数据

数据共享技术概述

许多应用程序包含相互依赖的控件、菜单和图形对象。因为每个回调函数都有自己的作用域,所以必须显式地与应用程序中需要访问它的部分共享数据。下表描述了在应用程序中共享数据的几种不同方法。

方法 描述 要求和权衡
将数据存储在UserData或其他对象属性中

直接通过组件对象查询或存储属性值。

所有的UI组件都有一个用户数据属性,可以存储任何MATLAB®数据。

  • 需要访问组件以设置或检索属性。

  • 用户数据一次只保存一个变量,但可以将多个值存储为结构体数组或单元格数组。

将数据存储为应用程序数据

方法将数据与特定组件关联setappdata函数。稍后可以使用getappdata函数。

  • 需要访问组件来设置或检索应用程序数据。

  • 可以共享多个变量。

创建嵌套回调函数(编程应用程序)

将回调函数嵌套在主函数中。这使回调函数可以访问主函数中的所有变量。

  • 要求回调函数编码在与主函数相同的文件中。

  • 不推荐用于GUIDE应用程序。

  • 可以共享多个变量。

使用guidata函数存储数据

控件与图形窗口共享数据guidata函数。

  • 通过任何UI组件存储或检索数据。

  • 一次只存储一个变量,但可以将多个值存储为结构体数组或单元格数组。

将数据存储在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)存储值,svaldiffMax,在一个叫做数据

  • hObject。用户数据= data的值。数据用户数据属性。

当用户单击按钮时,button_callback使用这些命令来检索数据:

  • h = findobj('Tag','slider1')查找滑块组件。

  • data = h.UserData获取滑块的值用户数据财产。

在GUIDE应用程序中共享用户数据

设置一个GUIDE应用程序来共享滑块数据用户数据属性,执行以下步骤:

  1. 在命令窗口中,键入指南

  2. 在“GUIDE快速入门”对话框中,选择空白GUI(默认).然后,单击好吧

  3. 在组件面板中显示UI组件的名称:

    1. 选择文件>首选项>指南

    2. 选择在组件面板中显示名称

    3. 点击好吧

  4. 从布局编辑器左侧的组件面板中选择按钮工具,并将其拖到布局区域中。

  5. 从布局编辑器左侧的组件面板中选择滑块工具,并将其拖到布局区域中。

  6. 选择文件>保存.将UI保存为myslider.fig.MATLAB在编辑器中打开代码文件。

  7. 的初始值用户数据开函数的性质,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,用户数据,数据)存储变量,数据,在用户数据属性。

  8. 向滑块回调添加修改数据的代码。将这些命令添加到函数的末尾,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,用户数据,数据),存储数据变量用户数据属性。

  9. 向按钮回调添加代码以检索数据。将这些命令添加到函数的末尾,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'),获取滑块的用户数据财产。然后,显示函数显示所存储的值。

  10. 按下保存代码保存在编辑器工具条中。

将数据存储为应用程序数据

要存储应用程序数据,请调用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应用程序来共享应用程序数据,请执行以下步骤:

  1. 在命令窗口中,键入指南

  2. 在“GUIDE快速入门”对话框中,选择空白GUI(默认).然后,单击好吧

  3. 在组件面板中显示UI组件的名称:

    1. 选择文件>首选项>指南

    2. 选择在组件面板中显示名称

    3. 点击好吧

  4. 从布局编辑器左侧的组件面板中选择按钮工具,并将其拖到布局区域中。

  5. 从布局编辑器左侧的组件面板中选择滑块工具,并将其拖到布局区域中。

  6. 选择文件>保存.将UI保存为myslider.fig.MATLAB在编辑器中打开代码文件。

  7. 在打开函数中设置应用程序数据的初始值,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可以使用此图形对象存储数据。

  8. 向滑块回调添加更改数据的代码。将这些命令添加到函数的末尾,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

  9. 向按钮回调添加代码以检索数据。将这些命令添加到函数的末尾,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

  10. 按下保存代码保存在编辑器工具条中。

创建嵌套回调函数(编程应用程序)

你可以在编程应用程序的主函数中嵌套回调函数。当你这样做时,嵌套回调函数与主函数共享一个工作空间。因此,嵌套函数可以访问主函数中定义的所有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]);结束结束
main函数定义了a结构体数组被称为数据.当用户移动滑块时,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窗口。

相关的话题

这个话题有帮助吗?