MATLAB App-在创建组件之前添加路径

时间:2018-07-05 10:54:19

标签: matlab matlab-app-designer

我在某个文件夹~/myapp/中有一个MATLAB App App.mlapp 。它使用的功能以及GUI中使用的某些图形在~/myapp/subfolder中。为了正确运行 App.mlapp ,我每次必须在启动应用之前手动将~/myapp/subfolder添加到我的路径中。

如何自动添加子文件夹?

我尝试将addpath(genpath(~/myapp/subfolder));放在StartupFcn的开头。但是,由于StartupFcn是在创建组件后调用的,已经需要~/myapp/subfolder中的某些图形,因此该方法不起作用。组件是使用自动创建的功能createComponents创建的,无法使用App Designer编辑器进行编辑。

最小的示例,按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 :(得分:5)

虽然我了解在appdesigner中进行设计时MATLAB决定锁定许多GUI代码的决定,但我也一直在向他们大声疾呼像这样的潜在重大缺点。

除了Soapbox之外,您还可以利用MATLAB的class property specification行为来解决此问题,行为将在执行其余类代码之前将属性初始化为其默认属性。

在这种情况下,我们可以添加一个虚拟私有变量并将其设置为addpath的输出:

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

通过适当的路径时,这会提供所需的行为。