许多应用程序包含相互依赖的控件、菜单和图形对象。由于每个回调函数都有自己的作用域,你必须显式地与应用中需要访问它的部分共享数据。下表描述了在应用程序中共享数据的几种不同方法。
方法 | 描述 | 需求和权衡 |
---|---|---|
将数据存储在UserData或其他对象属性中 | 直接通过组件对象获取或设置属性值。 所有UI组件都有 |
|
将数据存储为应用程序数据 | 类将数据与特定组件关联 |
|
创建嵌套回调函数(编程应用) | 将回调函数嵌套在主函数中。这使得回调函数可以访问主函数中的所有变量。 |
|
使用guidata函数存储数据 | 控件与图形窗口共享数据 |
|
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)
存储值,sval
和diffMax
,在一个叫做数据
.
hObject。用户数据= data
的值。数据
在用户数据
属性。
当用户单击按钮时button_callback
使用这些命令来检索数据:
h = findobj('Tag','slider1')
查找滑块组件。
data = h.UserData
获取滑动块的值用户数据
财产。
设置一个GUIDE应用程序来共享滑块数据用户数据
属性,执行以下步骤:
在命令窗口中,键入指南
.
在“GUIDE快速入门”对话框中选择空白GUI(默认).然后,单击好吧.
在组件面板中显示UI组件的名称:
选择文件>首选项>指南.
选择在组件面板中显示名称.
点击好吧.
从Layout Editor左侧的组件调色板中选择按钮工具,并将其拖放到布局区域中。
从布局编辑器左侧的组件调色板中选择滑块工具,并将其拖到布局区域中。
选择文件>保存.将UI保存为myslider.fig
.在MATLAB编辑器中打开代码文件。
的初始值用户数据
属性,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,用户数据,数据)
存储变量,数据
,在用户数据
属性。向滑动器回调中添加代码以修改数据。将这些命令添加到函数的末尾,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,用户数据,数据)
,存储数据
的变量用户数据
属性。向按钮回调中添加代码以检索数据。将这些命令添加到函数的末尾,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')
,获取滑块用户数据
财产。然后,显示
函数显示存储的值。
按下保存代码保存在编辑器工具栏中。
要存储应用程序数据,请调用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快速入门”对话框中选择空白GUI(默认).然后,单击好吧.
在组件面板中显示UI组件的名称:
选择文件>首选项>指南.
选择在组件面板中显示名称.
点击好吧.
从Layout Editor左侧的组件调色板中选择按钮工具,并将其拖放到布局区域中。
从布局编辑器左侧的组件调色板中选择滑块工具,并将其拖到布局区域中。
选择文件>保存.将UI保存为myslider.fig
.在MATLAB编辑器中打开代码文件。
在开启功能中设置应用数据的初始值,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
可以使用这个图形对象来存储数据。向滑动器回调添加代码以更改数据。将这些命令添加到函数的末尾,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
.向按钮回调中添加代码以检索数据。将这些命令添加到函数的末尾,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
.按下保存代码保存在编辑器工具栏中。
你可以在可编程应用的主函数中嵌套回调函数。当你这样做时,嵌套的回调函数与主函数共享一个工作空间。因此,嵌套函数可以访问主函数中定义的所有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]);结束结束
结构体
数组被称为数据
.当用户移动滑动条时slider_callback
函数更新瓦尔
和diffMax
田野数据
结构。当最终用户单击按钮时button_callback
中存储的值数据
.
不建议GUIDE应用使用嵌套函数。
的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使用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窗口。