Обмен информацией между двумя приложениями (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
Другие вопросы по тегам