文档

在回调之间共享数据

数据共享技术概述

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

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

直接通过组件对象获取或设置属性值。

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

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

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

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

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

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

  • 可以共享多个变量。

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

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

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

  • 不建议使用GUIDE应用程序。

  • 可以共享多个变量。

使用guidata函数存储数据

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

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

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

将数据存储在UserData或其他对象属性中

UI组件在其属性中包含有用的信息。例如,您可以通过查询滑块的当前位置价值财产。此外,所有组件都有用户数据属性,可以存储任何MATLAB变量。类中存储的值用户数据属性,只要这些函数可以访问组件。

在程序创建的应用程序中共享用户数据

使用点表示法,组件propertyname,以编程方式获取或设置属性值。点表示法在R2014b和以后的版本中工作。这段代码获取并设置图形的名称。

Hfig =图;figname = hfig.Name;hfig。Name = 'My Window';
如果您使用的是较早的版本,请使用得到功能:
Hfig =图;figname = get(hfig,'Name');集(hfig,“名字”,“我的窗户”);

如果您的代码不能直接访问组件,请使用findobj函数来搜索该组件。如果搜索成功,findobj返回组件作为输出。然后就可以访问组件的属性了。

下面的应用代码使用用户数据属性共享有关滑块的信息。要查看其工作原理,请将此代码复制并粘贴到编辑器中并运行它。

函数My_slider () hfig = figure();Slider = uiconcontrol (“父”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(对象,'值');% maxval = get(hObject,'Max');% diffMax = maxval - sval;% data = struct('val',sval,'diffMax',diffMax);%设置(hObject,用户数据,数据);结束函数button_callback(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. 从Layout Editor左侧的组件调色板中选择按钮工具,并将其拖放到布局区域中。

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

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

  7. 的初始值用户数据属性,myslider_OpeningFcn.这个函数在UI对用户可见之前执行。

    myslider_OpeningFcn,在命令后立即插入这些命令,句柄。输出= hObject

    数据= struct(“val”0,“diffMax”1);集(handles.slider1,“用户数据”、数据);
    添加命令后,myslider_OpeningFcn看起来像这样。
    函数myslider_OpeningFcn(hObject, eventdata, handles, varargin)%此函数没有输出参数,请参阅OutputFcn。%对象句柄到图形% eventdata保留-将在MATLAB的未来版本中定义包含句柄和用户数据的%句柄结构(参见GUIDATA)% varargin命令行参数为垃圾(参见varargin)%选择myslider的默认命令行输出句柄。output = hObject;数据= struct(“val”0,“diffMax”1);集(handles.slider1,“用户数据”、数据);%更新句柄结构guidata (hObject处理);% UIWAIT使myslider等待用户响应% uiwait (handles.figure1);
    请注意,处理输入参数是myslider_OpeningFcn.的处理变量是一个包含UI中所有组件的结构。此结构中的每个字段对应于一个单独的组件。每个字段名都与标签属性。因此,handles.slider1是这个UI中的滑块组件。的命令,集(handles.slider1,用户数据,数据)存储变量,数据,在用户数据属性。

  8. 向滑动器回调中添加代码以修改数据。将这些命令添加到函数的末尾,slider1_Callback

    maxval = get(对象)“马克斯”);sval = get(对象);“价值”);diffMax = maxval - sval;data = get(对象)“用户数据”);数据。瓦尔= sval; data.diffMax = diffMax;%将数据存储在滑块的UserData中集(hObject,“用户数据”、数据);
    添加命令后,slider1_Callback看起来像这样。
    %—在滑块移动时执行。函数slider1_Callback(hObject, eventdata, handles)%对象句柄到滑块1(参见GCBO)% eventdata保留-将在MATLAB的未来版本中定义包含句柄和用户数据的%句柄结构(参见GUIDATA)%提示:get(hObject,'Value')返回滑块的位置% get(hObject,'Min')和get(hObject,'Max')来确定滑动块的范围maxval = get(对象)“马克斯”);sval = get(对象);“价值”);diffMax = maxval - sval;data = get(对象)“用户数据”);数据。瓦尔= sval; data.diffMax = diffMax;%将数据存储在滑块的UserData中集(hObject,“用户数据”、数据);
    请注意,hObject的输入参数是slider1_Callback函数。hObject总是触发回调的组件(在本例中是滑动条)。因此,集(hObject,用户数据,数据),存储数据的变量用户数据属性。

  9. 向按钮回调中添加代码以检索数据。将这些命令添加到函数的末尾,pushbutton1_Callback

    %从滑块中获取UserDataData = get(handles.slider1,“用户数据”);Currentval = data.val;diffval = data.diffMax;显示([currentval diffval]);
    添加命令后,pushbutton1_Callback看起来像这样。

    %—在pushbutton1中按下按钮时执行。函数pushbutton1_Callback(hObject, eventdata, handles)%对象句柄到pushbutton1(参见GCBO)% eventdata保留-将在MATLAB的未来版本中定义包含句柄和用户数据的%句柄结构(参见GUIDATA)%从滑块中获取UserDataData = get(handles.slider1,“用户数据”);Currentval = data.val;diffval = data.diffMax;显示([currentval diffval]);

    这段代码使用handles结构来访问滑块。的命令,data = get(handles.slider1,'UserData'),获取滑块用户数据财产。然后,显示函数显示存储的值。

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

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

要存储应用程序数据,请调用setappdata功能:

setappdata (obj,名称,值);
第一个输入,obj是要在其中存储数据的组件对象。第二个输入,名字是描述值的友好名称。第三个输入,价值,是你想要存储的值。

要检索应用程序数据,请使用getappdata功能:

数据= getappdata(obj,name);
的组件,obj,必须是包含数据的组件对象。第二个输入,名字,必须与用于存储数据的名称相匹配。不像用户数据属性,该属性只包含一个变量,您可以使用setappdata存储多个变量。

在程序创建的应用程序中共享应用程序数据

这个应用程序使用应用程序数据共享两个值。要查看其工作原理,请将此代码复制并粘贴到编辑器中并运行它。

函数My_slider () hfig = figure();setappdata (hfig“slidervalue”, 0);setappdata (hfig“差异”1);Slider = uiconcontrol (“父”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');% currval = get(hObject,'Value');% diffMax = maxval -曲线;% parentfig = get(hObject,'Parent');% setappdata (parentfig, slidervalue, currval);% setappdata (parentfig‘差异’,diffMax);结束函数button_callback(hObject,eventdata) currentval = getappdata(hObject。父母,“slidervalue”);diffval = getappdata(对象)。父母,“差异”);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. 从Layout Editor左侧的组件调色板中选择按钮工具,并将其拖放到布局区域中。

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

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

  7. 在开启功能中设置应用数据的初始值,myslider_OpeningFcn.这个函数在UI对用户可见之前执行。在myslider_OpeningFcn,在命令后立即插入这些命令,句柄。输出= hObject

    setappdata (handles.figure1“slidervalue”, 0);setappdata (handles.figure1“差异”1);
    添加命令后,myslider_OpeningFcn看起来像这样。
    函数myslider_OpeningFcn (hObject eventdata处理,变长度输入宗量)%此函数没有输出参数,请参阅OutputFcn。%对象句柄到图形% eventdata保留-将在MATLAB的未来版本中定义包含句柄和用户数据的%句柄结构(参见GUIDATA)% varargin命令行参数为垃圾(参见varargin)为垃圾选择默认命令行输出句柄。output = hObject;setappdata (handles.figure1“slidervalue”, 0);setappdata (handles.figure1“差异”1);%更新句柄结构guidata (hObject处理);% UIWAIT使垃圾等待用户响应(参见UIRESUME)% uiwait (handles.figure1);
    请注意,处理输入参数是myslider_OpeningFcn.的处理变量是一个包含UI中所有组件的结构。此结构中的每个字段对应于一个单独的组件。每个字段名都与标签属性。在这种情况下,handles.figure1是图形对象。因此,setappdata可以使用这个图形对象来存储数据。

  8. 向滑动器回调添加代码以更改数据。将这些命令添加到函数的末尾,slider1_Callback

    maxval = get(对象)“马克斯”);currval = get(对象)“价值”);diffMax = maxval -曲线;%存储应用程序数据setappdata (handles.figure1“slidervalue”, currval);setappdata (handles.figure1“差异”, diffMax);
    添加命令后,slider1_Callback看起来像这样。
    函数slider1_Callback(hObject, eventdata, handles)%对象句柄到滑块1(参见GCBO)% eventdata保留-将在MATLAB的未来版本中定义包含句柄和用户数据的%句柄结构(参见GUIDATA)%提示:get(hObject,'Value')返回滑块的位置% get(hObject,'Min')和get(hObject,'Max')来确定滑动块的范围maxval = get(对象)“马克斯”);currval = get(对象)“价值”);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中按下按钮时执行。函数pushbutton1_Callback(hObject, eventdata, handles)%对象句柄到pushbutton1(参见GCBO)% eventdata保留-将在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);Slider = uiconcontrol (“父”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(对象,'值');% maxval = get(hObject,'Max');% diffMax = maxval - sval;数据。瓦尔= sval; data.diffMax = diffMax;结束函数button_callback (hObject eventdata)显示([数据。val data.diffMax]);结束结束
main函数定义了结构体数组被称为数据.当用户移动滑动条时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));Slider = uiconcontrol (“父”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(对象)作为结构检索存储的数据。

  • 数据。diffMax = maxval - data.val修改diffMax结构中的字段。

  • guidata (hObject、数据)存储修改后的结构。

当用户单击按钮时button_callback函数调用guidata检索存储结构的副本。然后显示存储在结构中的两个值。

在GUIDE Apps中使用指南

GUIDE使用guidata函数来存储一个名为处理,其中包含所有UI组件。MATLAB通过处理数组到每个回调函数。如果你想用guidata控件中添加字段以共享其他数据处理结构中开启功能。开始函数是在代码文件顶部附近定义的函数,它具有_OpeningFcn在名字里。

要修改回调函数中的数据,请修改处理结构,然后使用guidata函数。这个滑动条回调函数显示了如何修改和存储处理结构在GUIDE回调函数中。

函数slider1_Callback (hObject eventdata处理)%对象句柄到滑块1(参见GCBO)% eventdata保留-将在MATLAB的未来版本中定义包含句柄和用户数据的%句柄结构(参见GUIDATA)%提示:get(hObject,'Value')返回滑块的位置% get(hObject,'Min')和get(hObject,'Max')来确定范围句柄。Myvalue = 2;guidata (hObject处理);结束

示例:共享滑块数据的使用guidata

下面是一个预先构建的GUIDE应用程序,它使用guidata函数在滑块和文本字段之间共享数据。移动滑块时,文本字段中显示的数字将更改以显示新的滑块位置。

单击此处显示的按钮以打开示例。点击绿色按钮运行应用程序跑图向导窗口顶部的按钮。

示例:在两个应用程序之间共享数据

这是一个预构建的GUIDE应用程序,它使用应用程序数据和guidata在两个对话框之间共享数据的功能。在第二个对话框中输入文本并单击好吧,按钮标签在第一个对话框中改变。

单击此处显示的按钮以打开示例。点击绿色按钮运行应用程序跑图按钮的顶部changeme_main.fig向导窗口。

changeme_main.m,buttonChangeMe_Callback命令功能显示第二个对话框:

changeme_dialog (changeme_main, handles.figure)

handles.figure输入参数是数字对象的changeme_main对话框。

changeme_dialog函数检索处理结构数字对象。的整个组件集changeme_main对话框可用于第二个对话框。

示例:在三个应用程序之间共享数据

这是一个预先构建的GUIDE应用程序,它使用guidata用户数据在三个应用程序窗口之间共享数据。大窗口是一个图标编辑器,它接受来自工具调色板和调色板窗口的信息。

单击此处显示的按钮以打开示例。点击绿色按钮运行应用程序跑图按钮的顶部guide_iconeditor.fig窗口。

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窗口。

相关的话题

这个话题有帮助吗?