2017-01-04 2 views
1

Ich habe drei GUIs in MATLAB. Das Etikett von jedem von ihnen ist 'P0', 'P1' und 'P2'. Ich möchte die Handles aller drei GUIs in einer Struktur setzen und in der Lage sein, von einer der drei GUIs zu dieser Struktur zu gelangen und die darin enthaltenen Werte zu aktualisieren. Was ist der beste Weg, dies zu erreichen?Struktur der Griffe von GUIs MATLAB

+0

Haben Sie 'getappdata' und' setappdata' angeschaut? – Matt

+0

Es kann sich lohnen, eine 'handle'-Klasse zu erstellen, in der Sie Ihre Daten speichern, und dann können Sie ein Handle mit' guidata' speichern und von einer der beiden GUI ändern. – Suever

Antwort

5

Sie haben ein paar Möglichkeiten, wie Sie dies tun können. Eine Möglichkeit wäre, das Root-Grafikobjekt zusammen mit setappdata und getappdata zum Speichern und Abrufen von Werten zu verwenden.

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); 

Dann aus Ihrem Rückruf, dann würden Sie einfach diese Struktur holen und es verwenden, um direkt

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 

Eine weitere Möglichkeit, eine handle class zu verwenden ist Ihre Werte zu speichern und dann können Sie speichern eine Referenz zu dieser Handle-Klasse innerhalb der handles Struktur jeder GUI. Wenn Sie Änderungen an dieser Struktur vornehmen, werden die Änderungen in allen GUIs widergespiegelt.

Eine einfache Möglichkeit, dies zu tun, wäre structobj zu verwenden (Disclaimer: Ich bin der Entwickler), die jede struct in ein handle Objekt konvertieren.

% 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) 

Da wir eine Sache im guidata der Figur gespeichert, wird automatisch über den Standard handles Eingabeargument für Ihren Rückruf übergeben werden. So, jetzt Ihr Rückruf würde in etwa so aussehen:

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 

Der Vorteil dieses Ansatzes besteht darin, dass Sie mehrere Instanzen Ihrer drei GUIs laufen zur gleichen Zeit und die Daten miteinander nicht stört haben können.

+0

Vielen Dank – chsafouane