新浪博客

MATLAB GUI:不同界面(GUI)之间的数据传递

2016-08-27 22:03阅读:
作者:蜂蜂 日期:2016-08-27
总结一下MATLABGUI中如何获取(Get)一个变量、如何设置(Set)一个变量,包括以下两中情形:1)同一界面内部的变量的获取与设置2)不同界面之间的变量的获取与设置

1. 同一界面内的数据传递
获取界面上的某项数据基本操作思路是:先找到目标对象O的句柄(即Handles,你可以把一个对象的句柄看成是该对象的身份证号码——通过句柄我们就可以确定与之相对应的唯一对象),然后提取对象O的目标属性值。一个对象通常对应多个属性,要先搞清楚自己需要提取哪一个属性。比如,对于图1面板中右侧的uitable对象,我们可以提取该表格的名称(Name属性)、表格中的数据(Data属性)、列名称(ColumnName属性
),等等。这些属性可以通过GUIDEInspector查询,如图2所示。
MATLAB <wbr>GUI:不同界面(GUI)之间的数据传递图1:GUI中的uitable对象(Tag:TMCDataPreviewTab)
MATLAB <wbr>GUI:不同界面(GUI)之间的数据传递图2:图1中右侧uitable对象的属性
下面以获取图1中右侧uitable的句柄为例,介绍获取当前界面中的某对象O的句柄两种常用方法
方法1在触发当前uitable的某个回调函数时(例如单击表格中的某个单元格时),该回调函数的Object参数即为当前回调函数所对应的GUI对象的句柄。例如,我们右击图1TagTMCDataPreviewTabuitable,选择View Callbacks->CellSelectionCallback即可在m文件编辑器中打开当前uitable对象的CellSelectionCallback回调函数,如图3所示。
MATLAB <wbr>GUI:不同界面(GUI)之间的数据传递图3:图1中右侧uitable对象的CellSelectionCallback回调函数
上面的函数共有3个参数:hObjecteventdatahandles;其中,hObject即为当前对象的句柄。利用hObjectget()函数即可提取当前表格对象的某项属性值。例如,在图3中添加下面的代码:
TabData1 = get(hObject, 'data');
assignin('base', 'TabData1', TabData1);
上面第一行提取当前表格的'data'属性的值——即该表中的数据(数组形式),并将结果返回到变量TabData1中。第二行是将GUI中的变量复制到MATLAB的工作空间中,便于查看(此行代码可省略)。下面的2行代码可以实现同样的功能:
TabData2 = hObject.Data; % 这里的Data大小写不能出错
assignin('base', 'TabData2', TabData2);
结果如图4所示:当选中图4中右侧表格中的某个单元时,利用上面的代码提取的当前表格中的数据被分别存储到两个变量 TabData1 TabData2 中,并在MATLAB Workspace中显示出来。
MATLAB <wbr>GUI:不同界面(GUI)之间的数据传递图4:在当前uitable的CellSelectionCallback回调函数中提取当前uitable中的data
方法2回调函数中的第3个参数handles为一个结构体,它保存了当前界面中所有对象的句柄以及用户自己定义的数据。因此在当前界面的任意一个对象的回调函数中,我们都可以利用handles来获取当前界面内的其它对象的某项属性值。在图1所示的界面中,在m文件中找到 Data Pre-processing->MissingRate Analysis 按钮所对应的回调函数,如图5所示:
MATLAB <wbr>GUI:不同界面(GUI)之间的数据传递图5:Missing Rate Analysis的回调函数
该按钮与图1中的uitable位于同一个界面内,因此利用 handles + 目标对象的Tag + get()函数 即可在Missing Rate Analysis的回调函数提取uitable中的数据进行分析。在图5的下方添加以下代码:
TabData1 = get(handles.TMCDataPreviewTab, 'data');
assignin('base', 'TabData1', TabData1);
或者,
temp = get(handles.TMCDataPreviewTab);
TabData2 = temp.Data;
assignin('base', 'TabData2', TabData2)
上面的代码中TMCDataPreviewTab是目标表格的Tag。利用上面的代码即可在单击‘Missing Rate Analysis’菜单按钮的时候提取uitable中的数据,效果如下:
MATLAB <wbr>GUI:不同界面(GUI)之间的数据传递图6:表格数据提取效果

2. 不同界面之间的数据传递
假设在另一个名为 figExamMisDataHdl 的界面中需要用到当前界面(名为figMainhdl)中的uitable中的数据,可以在相应的控件的回调函数中添加如下代码:
global figMainhdl;
figMian_TMCDataPreviewUitable = findall(figMainhdl, 'Tag', 'TMCDataPreviewTab'); % 查找目标对象的句柄
rawTMCDataCell = get(figMian_TMCDataPreviewUitable, 'data');
这里使用的是 全局变量+findall()函数+get()函数 的方法。第一句中申明将要使用的全局变量figMainhdl,该变量在figMainhdl界面的加载函数中已经申明;第二句利用findall()函数在目标界面figMainhdl中查找目标对象TMCDataPreviewTab的句柄;第三句利用get()函数获取目标对象'data'的属性值,并将结果存储到变量rawTMCDataCell中。可见,获取不同界面之间的数据时,仍然使用的是以下思路:
1)查找目标窗体中的目标对象的句柄值;
2)利用get()函数提取该对象的属性值。

无论是在同一界面、还是在不同的界面之间设置某个对象的某项属性时,也是使用的上述思路——仅需把get()函数换成set()即可:
1)确定目标对象的句柄值;
2)利用set()对目标对象的属性进行设置;
3set(目标对象的句柄, 需要修改的属性名称, 新的属性值)
(完)​

我的更多文章

下载客户端阅读体验更佳

APP专享