失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > MATLAB GUI中的handles

MATLAB GUI中的handles

时间:2020-07-11 02:25:02

相关推荐

MATLAB GUI中的handles

MATLABGUI中的handles结构体及其用法

适合GUI入门什么是handles简单的handles函数(可以只看1)数据在不同控件间的传递重点:如何传递获取控件和用户自定义数据保存用户数据到guidata在不同GUI之间传递数据传入传出

适合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,识别算法的Pushbutton3Pushbutton1导入的图片要在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 就得到了传出来的结果。

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

guidata handles理解

matlab handles结构体

matlab handles结构体及用法

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

如果觉得《MATLAB GUI中的handles》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。