MATLAB: Purpose of guidata(hObject,handles)

guiguide

I've been working with GUI GUIDE.
What is the purpose or role of guidata(hObject,handles)?
Thanks,
Amanda

Best Answer

Every graphics "object" (a figure, an axes, a button, a textbox etc) is represented by a "handle" variable. That's the hObject.
If you're making a GUI, you actually want to store data about the "state" of the program inside the GUI somewhere. Think of a GUI with 2 buttons (one with a "+", one with a "-") and a text display that starts at "1". If the user clicks the +, that display should increment. If the user clicks the "-" that display should decrement.
Somewhere in the GUI, a "counter" variable needs to be stored. One way of doing it is storing it in the "guidata" of your figure's GUI. That's a special location specifically for GUIs. I think that there are two reasons why it's special:
  1. Every hObject (a pushbutton, an axes, etc) that is a child of the same figure points to the same "guidata". So it's a common place for all parts of a GUI to share data.
  2. Any callback function in the GUI automatically gets the guidata as its third argument. That is, whenever you click a button of a GUI with some guidata set, the input parameters (by default) is always a copy of guidata(GUIhandle), made immediately at the time of clicking the button.
So a callback function will look like:
function pushButtonCallback(buttonHandle, eventData, handles)
...
disp(handles)
Now, handles is just a structure, so let's say that we've stored the counter that we're using in handles.counter. In other words, somewhere at the start of your GUI you had lines like:
handles = guidata(hObject);
handles.counter = 1;
guidata(hObject, handles);
When they hit the "+" button, we want to increment handles.counter, but we also want this new value available to every other callback. To do that, we need to update the handles.counter field, and then put handles back into the GUIs guidata. As soon as we've done that, the next time the user clicks a button, they'll be using the newly updated version of handles.
function plusPushButtonCallback(buttonHandle, eventData, handles)
% At THIS point, "handles" is just a copy of guidata for the GUI
handles.counter = handles.counter + 1;
% At THIS point, "handles" is different to the guidata for the GUI
guidata(buttonHandle, handles);
% At THIS point, "handles" has been put back in as new guidata for the GUI
Did that make things a little clearer Amanda?