Обмен информацией между двумя приложениями (app disigner)
Может ли кто-нибудь сказать мне, как я могу заставить мое основное приложение открывать вторичное приложение, которое будет захватывать некоторые значения и затем отправлять их обратно в мое основное приложение?
Мне известно, что эта проблема решена в документации дизайнера приложений, но я не смог успешно выполнить эти шаги. Кроме того, я попытался запустить пример, но Matlab говорит, что файл не существует. Если кто-нибудь мог бы поделиться этим примером, это также было бы очень полезно.
2 ответа
Я никогда не пытался реализовать это самостоятельно, но часто спрашивал себя, как мне это сделать, столкнувшись со сложной архитектурой приложений.
На самом деле, если вы создаете два GUI в одном и том же скрипте / функции или если у вас один GUI, создающий другой GUI внутри одной из его функций, самым простым способом было бы play with function handles
, Например, первый GUI может передавать дескриптор функции, определенный среди его функций, в конструктор целевого GUI, и, таким образом, целевой GUI может вызывать его для изменения данных и / или свойств первого GUI при необходимости.
В любом случае стандартный подход, который считается наилучшей практикой, работает следующим образом. Давайте предположим, что у вас есть два GUI с именем G1
а также G2
и что они различны (вы не используете два экземпляра одного и того же графического интерфейса). Если они оба видны (HandleVisibility
установлен в on
) и у них обоих есть Tag
идентификатор определен (G1
а также G2
в нашем примере) вы можете искать их в Matlab "рабочей области". Следовательно:
% This is a G2 event handler
function pushbutton1_Callback(hObject, eventdata, handles)
g1_h = findobj('Tag','G1');
if (~isempty(g1_h))
% get all data associated to G1
g1_data = guidata(g1_h);
% modify a G2 object based on a G1 object
set(handles.MyTextBox,'String',get(g1_data.MyEditBox,'String'));
end
end
Дизайнер приложений MATLAB генерирует GUI на основе классов, а не GUIDE на основе функций GUIDE. Преимущество этого подхода заключается в том, что мы можем передавать графические интерфейсы как объекты вместо того, чтобы проявлять творческий подход к таким вещам, как возврат функций или поиск объектов по тегам.
Вот простой программный пример, который иллюстрирует один подход к этой концепции. Главное окно рисунка открывает дополнительное окно подсказки, в котором есть два входа. Когда окно приглашения закрыто, основной графический интерфейс пользователя печатает входные значения в командном окне и завершает работу.
Главное окно:
classdef mainwindow < handle
properties
mainfig
butt
end
methods
function [self] = mainwindow()
% Build a GUI
self.mainfig = figure('Name', 'MainWindow', 'Numbertitle', 'off', ...
'MenuBar', 'none', 'ToolBar', 'none');
self.butt = uicontrol('Parent', self.mainfig, 'Style', 'Pushbutton', ...
'Units', 'Normalized', 'Position', [0.1 0.1 0.8 0.8], ...
'String', 'Push Me', 'Callback', @(h,e) self.buttoncallback);
end
function buttoncallback(self)
tmpwindow = subwindow(); % Open popupwindow
uiwait(tmpwindow.mainfig); % Wait for popup window to be closed
fprintf('Parameter 1: %u\nParameter 2: %u\n', tmpwindow.parameter1, tmpwindow.parameter2);
close(self.mainfig);
end
end
end
Подокно:
classdef subwindow < handle
properties
mainfig
label1
box1
label2
box2
closebutton
parameter1
parameter2
end
methods
function [self] = subwindow()
% Build a GUI
self.mainfig = figure('Name', 'SubWindow', 'Numbertitle', 'off', ...
'MenuBar', 'none', 'ToolBar', 'none');
self.label1 = uicontrol('Parent', self.mainfig, 'Style', 'text', ...
'Units', 'Normalized', 'Position', [0.4 0.7 0.2 0.05], ...
'String', 'Parameter 1');
self.box1 = uicontrol('Parent', self.mainfig, 'Style', 'edit', ...
'Units', 'Normalized', 'Position', [0.4 0.6 0.2 0.1], ...
'String', '10');
self.label2 = uicontrol('Parent', self.mainfig, 'Style', 'text', ...
'Units', 'Normalized', 'Position', [0.4 0.4 0.2 0.05], ...
'String', 'Parameter 2');
self.box2 = uicontrol('Parent', self.mainfig, 'Style', 'edit', ...
'Units', 'Normalized', 'Position', [0.4 0.3 0.2 0.1], ...
'String', '10');
self.closebutton = uicontrol('Parent', self.mainfig, 'Style', 'Pushbutton', ...
'Units', 'Normalized', 'Position', [0.4 0.1 0.2 0.1], ...
'String', 'Close Window', 'Callback', @(h,e) self.closewindow);
end
function closewindow(self)
% Drop our input parameters into this window's properties
self.parameter1 = str2double(self.box1.String);
self.parameter2 = str2double(self.box2.String);
% Close the window
close(self.mainfig);
end
end
end