Matlab的 GUI参数传递方式
matlab gui共有六种参数传递方式和范围各不相同
1.运用 gui本身的 varain{}、varaout{}传递参数(注:这种方式仅适用与 gui间传递数据,
且只适合与主子结构,及从主 gui调用子 gui,然后关掉子 gui,而不适合递进结构,即一步
一步实现的方式)
输入参数传递:
比如子 GUI的名称为 subGUI, 设想的参数输入输出为:[out1, out2] = subGUI(in1, in2)
在 subGUI的 m文件中(由 GUIDE自动产生):
1).第一行的形式为:function varargout = subGUI(varargin)
该行不用做任何修改;varargin 和 varargout 分别是一个可变长度的 cell 数组(MATLAB 帮
助文件中有说明)。输入参数 in1和 in2保存在 varargin中,输出参数 out1,out2包含在 varargout
中;
2).在 subGUI的 OpeningFcn中,读入参数,并用 guidata保存,即:
handles.in1 = varargin{1};
handles.in2 = varargin{2};
guidata(hObject, handles);
返回参数的设置:
1). 在 GUI 子程序的 OpeningFcn 函数的结尾加上 uiwait(handles.figure1); figure1 是
subGUI的 Tag;
2) . subGUI 中控制程序结束(如 "OK”和 "Cancel"按钮)的 callback 末尾加上
uiresume(handles.figure1),不要将 delete命令放在这些 callback中;
3). 在子 GUI的 OutputFcn中设置要传递出去的参数,如 varargout{1} = handles.out1;
varargout{2} = handles.out2;末尾添加 delete(handles.figure1); 结束程序。
在 GUI的 OpenFcn中,如果不加 uiwait, 程序会直接运行到下面,执行 OutputFcn。也
就是说程序一运行,返回值就确定了,再在其它部分对 handles.output作更改也没有效果了。
加上 uiwait后,只有执行了 uiresume后,才会继续执行到 OutputFcn,在此之前用户有充分
的时间设置返回值。
通过以上设置以后,就可以通过 [out1, out2] = subGUI(in1, in2) 的形式调用该子程序。
在一个 GUI中调用另一个 GUI时,主 GUI不需要特别的设置,同调用普通的函数一样。在
打开子 GUI界面的同时,主程序还可以响应其它的控件。不需要担心子 GUI的返回值被传
错了地方。
2. 运用 global定义全局变量传递参数(适用于 gui内控件间以及不同 gui间)
这种方式恐怕是最简单的方式,是很省心!但是但是,简单的问题就在于有时你会很头
疼!因为在每一个要到该全局变量的地方,你都要添一句 gloal x,还有就是如果你在一个地
方修改了 x的值,那么所有 x的值就都变了!有的时候恐怕会出现紊乱。另一个更重要的问
题在于,套用 C++的一句话,全局变量破坏了程序的封装性!所以,全局变量是能少用尽量
少用。
3. 运用 UserData传递参数(gui内)
直接通过对象的 userdata属性进行各个 callback之间的数据存取操作。首先必须将数据
存储到一个特定的对象中,假设对象的句柄值为 ui_handle,需要存储的值为 value,则输入以
下程序即可:
set('ui_handle','UserData',Value);
此时,value数据就存在句柄值为 ui_handle的对象内,在执行的过程中若要取回变量可
以通过以下方式在任意 callback中获取该数据值 :
value=get(''ui_handle,'UserData');
虽然使用这种方法简单 ,但是每个对象仅能存取一个变量值,因此当同一对象存储两
次变量时 ,先前的变量值就会被覆盖掉,因此都用 UserData存储简单与单一的数据。如下
面有两个 gui函数, myloadfn加载 mydata.mat文件,该文件内存储 XYData变量,其值
为 m*2 的绘图矩阵,加载后将该变量值存储到 当前的窗口的 UserData 属性中。另一个
myplotfcn函数则是用以获取该 UserData属性中存 取的绘图数据,然后绘图。代码如下:
function myloadfcn
load mydata;
set(gcbf,'UserData',XYdata)
function myplotfcn
XYdata=get(gcbf,'UserData');
x=XYData(:,1);
y=XYData(:,2);
plot(x,y);
4.应用 setappdata\getappdata与 rmappdata函数(gui间和 gui内,推荐使用)
使用上面三个函数最有弹性处理数据的传送问题,与 UserData 的方式相类似,但是克
服 UserData的缺点,使一个对象能存取多个变量值。
(1)getappdata函数
VALUE=getappdata(H,NAME)
(2)setappdata函数
setappdata(H,NAME,VALUE)
(3)rmappdata
rmappdata(H,NAME)
首先在 matlab命令窗口输入 magic(3)数据,因此当前的工作空间就存储了 magic(3)这组数据
了,然后建立一个按钮来获取并显示 magic(3)数据
>>A=magic(3);
>>setappdata(gcf,'A','A');%save
>>uicontrol(‘String’,'显示矩阵 A','callback','A=getappdata(gcf,'A')');
当在主子 gui内调用时,可以如下设置
fig1 调用 fig2 时,使用 fig2 指令来打开 fig2,在 fig2 的 m 文件中,在回调函数中用
setappdata(fig1,'A',A)实现返回 fig1,并将参数 A 传递给 fig1,然后在 fig1 的使用 A 的地方
添加 A=getappdata(fig1,‘A’)。
但这种方式的一个问题就是没调用一次,fig1 的数据就得初始化一次,这是因为
setappdata(fig1,'A',A)中出现了 fig1,调用一次 setappdata就得运行一次 fig1的缘故,解决方
案就是把 setappdata(fig1,'A',A)改为 setappdata(0,'A',A),这样把 A读入 matlab workspace,相
当于一个全局变量了,但当然比直接用 global定义全局变量好!
5. 结合 handles和 guidata函数(gui内,不推荐使用,经常出现问题,比如在 handles中添
加了变量对象 Y后可能就会挤掉 handles另外一个对象)
他的使用格式如下,如果你在 pushbutton1 中得到一个变量 X,相传出去,那么在
pushbutton1的 callback中,在得到 X后添加如下代码:
handles.X=X;
guidata(hObject,handles)(注意,一定是两行连写)
在 pushbutton2中要用到 X是,在其 callback先添加 X=handles.X; 即可得到 X的值。
6. 运用 save和 load(importdata)传递参数(gui内和 gui间)
将某变量 x 的值先存到磁盘,用的时候在调用。格式如下:save('*.mat','x');用的时候
就用 load('*.mat'),但这样只是把 x读 到了 matlab workspace,不会用显示,你还要再去查看
这个变量名, 然后才能用,建议使用 p=importdata('*.mat'),p 是一个结构体,可以随意使
用了。当然,这种方式涉及到磁盘读写,速度当然会有影响 的,一般情况不用,通常用在
保存以及导入某个变量时!
本文档为【Matlab的GUI参数传递方式】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。