MATLAB App - Добавить путь перед созданием компонента

У меня есть MATLAB App 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 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам