2017-01-04 1 views
1

J'ai trois interfaces graphiques dans MATLAB. L'étiquette de chacun d'eux est 'P0', 'P1' et 'P2'. Je souhaite placer les poignées des trois interfaces graphiques dans une structure et pouvoir accéder à cette structure à partir de l'une des trois interfaces graphiques et mettre à jour les valeurs qui s'y trouvent. Quelle est la meilleure façon d'y parvenir?Structure des poignées de GUI MATLAB

+0

Avez-vous regardé 'getappdata' et' setappdata'? – Matt

+0

Il peut être utile de créer une classe 'handle' dans laquelle vous stockez vos données, puis vous pouvez y stocker un handle avec' guidata' et le modifier à partir de l'une ou l'autre interface graphique. – Suever

Répondre

5

Vous avez quelques options pour ce faire. Une solution consisterait à utiliser l'objet graphique racine avec et getappdata pour stocker et récupérer des valeurs.

fig0 = findall(0, 'tag', 'P0'); 
fig1 = findall(0, 'tag', 'P1'); 
fig2 = findall(0, 'tag', 'P2'); 

% Combine the GUIdata into a single struct 
handles.P0 = guidata(fig0); 
handles.P1 = guidata(fig1); 
handles.P2 = guidata(fig2); 

% Store this struct in the root object where ALL GUIs can access it 
setappdata(0, 'myappdata', handles); 

Ensuite, à partir de votre rappel, vous voulez simplement chercher ce struct et l'utiliser directement

function mycallback(hObject, evnt, ~) 
    % Ignore the handles that is passed in and use your own 
    handles = getappdata(0, 'myappdata'); 

    % Now if you modify it, you MUST save it again 
    handles.P0.value = 1; 

    setappdata(0, 'myappdata', handles) 
end 

Une autre option est d'utiliser un handle class pour stocker vos valeurs et vous pouvez stocker une référence à cette classe de handles au sein de la struct handles de chaque interface graphique. Lorsque vous apportez des modifications à cette structure, les modifications seront répercutées dans toutes les interfaces graphiques.

Un moyen facile de le faire serait d'utiliser structobj (Disclaimer: Je suis le développeur) qui convertit tout en struct un objet handle.

% Create an object that looks like a struct but is a handle class and fill it with the 
% handles struct from each GUI 
handles = structobj(guidata(fig0)); 
update(handles, guidata(fig1)); 
update(handles, guidata(fig2)); 

% Now store this in the guidata of each figure 
guidata([fig0, fig1, fig2], handles) 

Puisque nous stockons une chose dans le guidata de la figure, il sera automatiquement transmis à votre rappel via le standard argument d'entrée handles. Alors maintenant, votre rappel ressemblerait à quelque chose comme:

function mycallback(hObject, evnt, handles) 
    % Access the data you had stored 
    old_thing = handles.your_thing; 

    % Update the value (changes will propagate across ALL GUIs) 
    handles.your_thing = 2; 
end 

L'avantage de cette approche est que vous pouvez avoir plusieurs instances de vos trois interfaces graphiques en cours d'exécution en même temps et les données ne seront pas interférer entre eux.

+0

Merci beaucoup – chsafouane