MATLAB GUI中的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)

  1. 添加新字段并赋值
    不只是控件可以写入结构体中,一些自定义的变量也可以写入结构体。(可以看作全局变量)
    某些变量需要在不同的函数之间进行传递,只有写入handles结构体,才能作为全局变量被保存并可以被其他控件的回调函数调用,否则只是一个函数中的参数。
handles.Name = X;
#Name可以自定,X为需要保存的value;
之前做了一个数字图像处理的作业,是先对图像进行去雾再识别,
GUI中有导入图片的Pushbutton1,去雾算法的Pushbutton2,识别算法的Pushbutton3
Pushbutton1导入的图片要在Pushbutton2中进行处理,用handles进行传递,同理在Pushbutton3中也用到Pushbutton2的处理结果
  1. 更改变量属性
    set(handles.Name, ’ ', ’ ');

  2. 保存数据
    guidata(hObject,handles);
    hObject是执行回调控件对象的句柄。

  3. 获取控件属性:get()函数
    如获取radiobutton1的属性,需要使用get()函数,

get(handles.radiobutton1) 
% 如果没有指定属性,默认返回所有属性
get(handles.radiobutton1,'string')  
% 我们只对radiobutton1的string属性兴趣的话,则可以使用获取指定属性。
  1. 修改控件属性: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里面的。
那启动参数可以是哪些呢?

  1. figure,也就是窗口参数
    比如说position之类
    例如:打开这个GUI时,使用这个命令 mygui(‘Position’,[434 234 234 34]) 则表示打开窗口在这个位置;其他可控属性可以查help。
  2. 自定义参数
    如果传入的参数不是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 就得到了传出来的结果。

参考了好多大佬的文章,向大佬们表示感谢:

guidata handles理解

matlab handles结构体
matlab handles结构体及用法

这三位大佬的文章在做课程作业时候给了我很大的帮助

  • 32
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值