MATLABGUI中的handles结构体及其用法
适合GUI入门
只是简单的设计一个GUI,只看到第三部分:数据在不同控件间的传递即可。
重点:如何传递
什么是handles
handle是一个结构体。
MATLAB在创建一个GUI时,会同时生成两个文件:.m 源程序文件 和.fig 用户界面窗口定义文件。
GUI的创建就是设计分布不同的控件,并对每一个控件写其功能函数,最终实现可视化界面并运行。
而同一个.fig下的所有控件,均可挂载在handles下。
handles结构体是一个以GUI中所有控件的Tag属性为字段的结构体,每个字段的取值就是对应控件的句柄.
handles结构体保存了窗体中所有Pushbutton,Radiobutton,StaticText等控件,以及Figure 自身的句柄。
句柄类似于C语言中指针,它是某个对象的唯一标识符,通过句柄就可以找到你需要的对象了。
handles.tag1就是指向Tag属性值为tag1的控件,
handles.tag1就是该控件的唯一标识符(句柄)。
简单的handles函数(可以只看1)
- 添加新字段并赋值
不只是控件可以写入结构体中,一些自定义的变量也可以写入结构体。(可以看作全局变量)
某些变量需要在不同的函数之间进行传递,只有写入handles结构体,才能作为全局变量被保存并可以被其他控件的回调函数调用,否则只是一个函数中的参数。
handles.Name = X;
#Name可以自定,X为需要保存的value;
之前做了一个数字图像处理的作业,是先对图像进行去雾再识别,
GUI中有导入图片的Pushbutton1,去雾算法的Pushbutton2,识别算法的Pushbutton3
Pushbutton1导入的图片要在Pushbutton2中进行处理,用handles进行传递,同理在Pushbutton3中也用到Pushbutton2的处理结果
-
更改变量属性
set(handles.Name, ’ ', ’ '); -
保存数据
guidata(hObject,handles);
hObject是执行回调控件对象的句柄。 -
获取控件属性:get()函数
如获取radiobutton1的属性,需要使用get()函数,
get(handles.radiobutton1)
% 如果没有指定属性,默认返回所有属性
get(handles.radiobutton1,'string')
% 我们只对radiobutton1的string属性兴趣的话,则可以使用获取指定属性。
- 修改控件属性:set()函数
如想修改radiobutton1的string属性,则需要使用set()函数,
set(handles.radiobutton1,'string','hello world')
% set(句柄,'属性名',属性值)
% 原来radiobutton1的显示字符串立即变为“hello world”
数据在不同控件间的传递
对控件的功能实现,就是写控件的回调函数。
每一个控件的回调函数头(以按钮pushbutton1为例):
function pushbutton1_Callback(hObject, eventdata, handles)
第一个参数 hObject ,是与这个回调函数callback所关联的控件的handles,在它自己的callback下,可以用代号-> hObject 来调用它。
只用知道,控件自己的回调函数调用自己的属性,只用 hObject.属性名 就可以了(中间加一点)。
第二个参数eventdata是MATLAB的保留参数(一般不考虑)。
第三个参数 handles 是这个GUI界面的代号。可以通过它获取界面的所有信息。所以在控件A自己的回调函数中,要获取或者设置其他控件的属性,就用handles.其他控件Tag.属性
handles hObject 都是结构体
handles是一个存放数据的结构体(广义上的概念)
1、GUI界面的handle是一个大结构体,并且这个结构体名字也叫做handles;
2、控件的handles是小结构体,它的名字叫做hObject;
3、大结构体里存放了所有的小结构体和所有用户数据(即控件和用户自定义的变量等),只需handles.控件A的tag
就可以存取控件A的信息。即,GUI创建了一个大结构体:结构体handles,
handles包括了figure中所有控件的句柄,也包括figure的句柄。
重点:如何传递
怎么把自己计算出或者需要用到的数据(或者变量)放到大结构体里呢?(相当于全局变量)
在任何地方(任意控件的回调函数中)
handles.自定义变量名 = 数据值 %(给结构体添加成员变量)
这样就定义了自己的变量。
在任何地方
I=handles.自定义变量名 %(结构体名加点号来引用成员变量)
就可以将变量值赋值给一个变量,并进行运算处理,同样也可以修改这个自定义成员变量。
别忘了在函数末尾使用
guidata(hObject, handles); %(不用改,直接复制黏贴)
来保存对handles和hObject的操作 。(不然自定义的变量就没了,用于保存这个全局变量)
获取控件和用户自定义数据
GUI界面的 handles结构体 保存着所有的控件信息以及用户自定义数据,所以只要获取GUI的handles就可以获取所有。
比如在自己定义的函数里获取handles,只需将handles作为输入,参数传递进去即可。
function my_function(handles)
% handles是GUI的handles
% 调用GUI内任意一控件的信息
% get(handles.控件A的tag,'要获取的属性名');
I = get(handles.my_popup,'Value');
保存用户数据到guidata
在其他子函数或者非figure内控件的callback内保存用户数据到guidata
GUIDE中, GUIDE生成了一个包括所有GUI句柄的结构体:handles,我们可以保存用户数据到其中
(GUIDE generates a handles structure that contains the GUI’s handles. You can add your own data to it)
guidata(hObject,handles);
% 在 figure 控件 callback 之内调用 guidata(hObject, handles),
% hObject是控件的句柄。
guidata(handles.figure1,handles);
% 如果在其他子函数或者非figure控件的 callback 中使用 guidata 保存数据,
% hObject 就不再是控件句柄,会出错。
% 所以我们要用 figure 的句柄代替hObject,即handles.figure1
链接: link.
在不同GUI之间传递数据
传入
打开一个GUI界面时,传给他的参数有哪些 ?
function mygui_OpeningFcn(hObject, eventdata, handles, varargin)
所有的启动参数都是通过 varargin 传到它的OpeningFcn里面的。
那启动参数可以是哪些呢?
- figure,也就是窗口参数
比如说position之类
例如:打开这个GUI时,使用这个命令 mygui(‘Position’,[434 234 234 34]) 则表示打开窗口在这个位置;其他可控属性可以查help。 - 自定义参数
如果传入的参数不是figure的属性(matlab查找不到输入的属性名),则输入的参数作为一个向量存放在varargin里面。
比如mygui(‘路人甲’,‘80‘),那varargin{1}存放了’路人甲’,varargin{2}=’80‘
达到了传入参数的目的。
传出
那怎么把数据传出来呢?
将要输出的数据存在handles.output里面
在GUI任意地方
handles.output=数据1;
handles.secend_output=数据2;
然后在GUI的outputFcn中加上
varaginout{1}=handles.output;
varaginout{2}=handles.secend_output;
这样就把数据传递出来了。
每一个GUI的最外层的函数语句:
function varargout = mygui(varargin)
看输入输出,就是这样了。GUI本身就是一个函数,
I=mygui(一些传入的参数) 就执行GUI并返回结果
I 就得到了传出来的结果。
参考了好多大佬的文章,向大佬们表示感谢:
这三位大佬的文章在做课程作业时候给了我很大的帮助