Matlab中guidata()的用法以及如何帮助参数在GUI间传递

handles 在gui中就是一个储存各种句柄和数据结构体.
guidata()函数是用来储存和取出这个结构体的函数, 将handles结构体存入figure的特定储存空间中或从中取出, 因此有两种用法:
1. guidata(hObject, handles); %%储存handles
2. handles = guidata(hObject); %%取出handles

hObject是当前回调函数对应的GUI对象的句柄;
eventdata为未定义的保留参数,即当前控件的相关变量;
handles是当前GUI所有数据的结构体,包含所有GUI对象的句柄和用户定义的数据;
varargin在初始化时是空的,在触发控件时,变成一个1X4的单元数组;
第一个varargin{1}表示触发控件后所要执行的回调函数的函数名。
如果想把一个局部变量变成全局变量,一个有效的方法是将变量存在handles中,获取handles结构体某个变量值的方法是x=handles.a。

handles仅仅只是一个结构体, 在函数之战传递时,如:
function push1_Callback(hObject, eventdata, handles)
handles.data1 = 'heygirl'; %%将字符串'heygirl'存入handles结构体
guidata(hObject, handles);



传入的只是handles的值, callback函数中的handles改变时, figure特定存储空间中的handles并没有改变. 因此必须使用guidata(hObject, handles)将改变的handles储存. hObject只是为了找到figure的特定储存空间, 可以是figure中的任意句柄. handles的传递就好像是函数间的形参与实参, 但是这里的形参可以通过guidata(hOject, handles)改变实参.
Ps:   运行gui时使用代码里的Run按钮, 因为双击打开将不会执行handles的生产代码, 为了不造成额外麻烦最好使用Run按钮.

以后是从帖子上看到的一个问答:
关于guidata函数用法的一个疑问,希望与君共同探讨
guidata 函数有两种使用方法,
其一是:
GUIDATA(H, DATA) 。 实现的是把指定的 DATA 变量内容储存到当前figure窗口 所开辟的某个存储变量(the figure's application data),我们不必深究具体是在哪里,反正是一块存储空间,把DATA交给当前窗口,让它去保存好了。DATA 可以是普通变量,也可以是结构体。H是当前窗口句柄或者当前窗口内控件句柄。

其二是:
DATA = GUIDATA(H) 。把之前存储的内容赋值给变量DATA。

英文帮助文档如下:
GUIDATA Store or retrieve application data.
    GUIDATA(H, DATA) stores the specified data in the figure's
    application data.

    H is a handle that identifies the figure - it can be the figure
    itself, or any object contained in the figure.

    DATA can be anything an application wishes to store for later
    retrieval.

    DATA = GUIDATA(H) returns previously stored data, or an empty
    matrix if nothing was previously stored.

MATLAB帮助文档举了个很好的例子,如下:
... excerpt from the GUI setup code ...
    f = openfig('mygui.fig');
    data = guihandles(f); % initialize it to contain handles
    data.errorString = 'Total number of mistakes: ';
    data.numberOfErrors = 0;
    guidata(f, data);  % store the structure

    ... excerpt from the slider's callback ...
    data = guidata(gcbo); % get the struct, use the handles:
    set(data.valueEdit, 'String',...
    num2str(get(data.valueSlider, 'Value')));




问题关于 guidata(hObject,handles)语句的。。这个好理解,我们自己定义了handles的域变量,如handles.a,并且该变量需要在不同控件中共享,通常做法是在相应的控件call_back函数结束前加上guidata(hObject,handles),代表把handles内容储存到当前figure窗口 所开辟的某个存储变量(the figure's application data),这个没问题。但是我觉得在每个回调函数的开头应该加上 handles =  guidata(hObject) ,因为这样才能返回之前存储的handles,这个handles数据才是更新后的。。。可是我们往往在A控件的回调函数中定义了handles.a,同时调用了guidata(hObject,handles)。 但是B控件要使用handles.a变量时候,并不不要handles =  guidata(hObject)语句。直接使用handles.a 也没问题。。不知道这是什么原因。请求解释!希望在GUI方面有研究的朋友,帮忙解释下,谢谢了!

网友的回复:
简单说:在进入 Callback 函数时,会自动生成3个变量:
1.handles = 全部物件句柄
2.eventdata = 该物件相关变量
3.hObject = 该物件本身句柄
所以就算不加入 handles =  guidata(hObject) 也是沒问题的
还有上面  handles =  guidata(hObject) 
必須修改成  handles =  guidata(gcf) or handles =  guidata(handles.figure1)
經常會有人使用錯誤,直接输入  hObject 這是指該物件的句柄
如果在不同物件时, guidata(hObject) 会导致资料保存在該物件,而非当前窗口
  • 39
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值