MATLAB App - Добавить путь перед созданием компонента - PullRequest
0 голосов
/ 05 июля 2018

У меня есть приложение MATLAB App.mlapp в определенной папке ~/myapp/. Используемые им функции и некоторые графические элементы, используемые в графическом интерфейсе, указаны в ~/myapp/subfolder. Чтобы правильно запустить App.mlapp , мне нужно каждый раз вручную добавлять ~/myapp/subfolder в мой путь перед запуском приложения.

Как автоматически добавить подпапку?

Я пытался поставить addpath(genpath(~/myapp/subfolder)); в начале StartupFcn. Однако, поскольку StartupFcn вызывается после создания компонента, который уже требует часть графики в ~/myapp/subfolder, этот подход не работает. Компоненты создаются с использованием автоматически созданной функции createComponents, которую нельзя редактировать с помощью редактора конструктора приложений.

Минимальный пример, запрошенный excaza. Чтобы создать его, откройте Дизайнер приложений, создайте новое приложение, добавьте кнопку в представлении «Дизайн» и укажите значок в пути с помощью Свойства кнопки -> Текст и значок -> Дополнительные свойства -> Файл значка . После этого удалите каталог значка из пути и попробуйте запустить приложение.

classdef app1 < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure  matlab.ui.Figure
        Button    matlab.ui.control.Button
    end

    % App initialization and construction
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Create UIFigure
            app.UIFigure = uifigure;
            app.UIFigure.Position = [100 100 640 480];
            app.UIFigure.Name = 'UI Figure';

            % Create Button
            app.Button = uibutton(app.UIFigure, 'push');
            app.Button.Icon = 'help_icon.png';
            app.Button.Position = [230 321 100 22];
        end
    end

    methods (Access = public)

        % Construct app
        function app = app1

            % Create and configure components
            createComponents(app)

            % Register the app with App Designer
            registerApp(app, app.UIFigure)

            if nargout == 0
                clear app
            end
        end

        % Code that executes before app deletion
        function delete(app)

            % Delete UIFigure when app is deleted
            delete(app.UIFigure)
        end
    end
end

1 Ответ

0 голосов
/ 05 июля 2018

Хотя я понимаю решение MATLAB заблокировать большую часть кода GUI при проектировании в appdesigner, я также довольно открыто высказывался им о потенциальных существенных недостатках, таких как этот.

Помимо Soapbox, вы можете обойти это, используя поведение свойства класса MATLAB , которое инициализирует свойства их свойствами по умолчанию до выполнения остальной части кода класса.

В этом случае мы можем добавить фиктивную приватную переменную и установить для нее значение addpath:

properties (Access = private)
    oldpath = addpath('./icons')
end

Что обеспечивает желаемое поведение при прохождении соответствующего пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...