MATLAB app designer 菜鳥進階學習(四)


4.在 App 設計工具中創建多窗口 App

  多窗口 App 由兩個或多個共享數據的 App 構成。App 之間共享數據的方式取決於設計。

  一種常見的設計包含兩個 App:一個主 App 和一個對話框。通常,主 App 中有一個按鈕用於打開該對話框。當用戶關閉對話框時,對話框將用戶的選擇發送給主窗口,主窗口執行計算並更新 UI。

  這兩個 App 在不同的時間通過不同的方式共享信息:

  • 當對話框打開時,主 App 將使用輸入參數調用對話框 App,將信息傳遞給對話框。

  • 當用戶點擊對話框中的確定按鈕時,對話框將使用輸入參數調用主 App 中的公共函數,將信息返回給主 App。

4.1 設計概述

  要創建多窗口的 App,必須創建兩個單獨的 App(主 App 和對話框 App)。然后執行以下高級任務,每個任務都包含多個步驟。

  • 將信息發送給對話框 - 在接受輸入參數的對話框 App 中編寫一個 StartupFcn 回調。必須有一個輸入參數是主 App 對象。然后在主 App 中使用輸入參數調用對話框 App。

  • 將信息返回給主 App - 在主 App 中編寫一個公共函數,以根據用戶在對話框中的選擇來更新 UI。由於它是公共函數,因此對話框可以調用它並將值傳遞給它。

  • 關閉窗口時的管理任務 - 在兩個 App 中各編寫一個 CloseRequest 回調,在窗口關閉時執行維護任務。

 4.2 實例先行

  此 App 由一個主繪圖 App 構成,主繪圖 App 中有一個按鈕,用於在對話框中選擇選項。選項按鈕使用輸入參數調用對話框 App。在對話框中,確定按鈕的回調通過調用主 App 中的公共函數,將用戶的選擇發送回主 App。

將信息發送給對話框

  執行以下步驟,將值從主 App 傳遞給對話框 App。

 

 設計內容:

  新建一個主app,按照下圖安放控件

   代碼:

classdef MainAppExample < matlab.apps.AppBase

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


    properties (Access = private)
        DialogApp                   % Dialog box app
        CurrentSize = 35;           % Surface sample size
        CurrentColormap = 'Parula'; % Colormap
    end

    methods (Access = public)
    
        function updateplot(app, sz, c)
            % Store inputs as properties
            app.CurrentSize = sz;
            app.CurrentColormap = c;
            
            % Update plot 
            Z = peaks(sz);
            surf(app.UIAxes,Z);
            colormap(app.UIAxes,c);
            
            % Re-enable the Plot Options button
            app.OptionsButton.Enable = 'on';
        end
        
    end


    % Callbacks that handle component events
    methods (Access = private)

        % Code that executes after component creation
        function startupFcn(app)
            % Call updateplot to display an initial plot
            updateplot(app, app.CurrentSize, app.CurrentColormap)
        end

        % Button pushed function: OptionsButton
        function OptionsButtonPushed(app, event)
            % Disable Plot Options button while dialog is open
            app.OptionsButton.Enable = 'off';
            
            % Open the options dialog and pass inputs
            app.DialogApp = DialogAppExample(app, app.CurrentSize, app.CurrentColormap);
        end

        % Close request function: UIFigure
        function MainAppCloseRequest(app, event)
            % Delete both apps
            delete(app.DialogApp)
            delete(app)
        end
    end

    % Component initialization
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [100 100 449 370];
            app.UIFigure.Name = 'Display Plot';
            app.UIFigure.CloseRequestFcn = createCallbackFcn(app, @MainAppCloseRequest, true);

            % Create UIAxes
            app.UIAxes = uiaxes(app.UIFigure);
            app.UIAxes.Position = [68 68 341 267];

            % Create OptionsButton
            app.OptionsButton = uibutton(app.UIFigure, 'push');
            app.OptionsButton.ButtonPushedFcn = createCallbackFcn(app, @OptionsButtonPushed, true);
            app.OptionsButton.Position = [189 23 100 22];
            app.OptionsButton.Text = 'Options';

            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end

    % App creation and deletion
    methods (Access = public)

        % Construct app
        function app = MainAppExample

            % Create UIFigure and components
            createComponents(app)

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

            % Execute the startup function
            runStartupFcn(app, @startupFcn)

            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

  再建第二個對話框app,控件安放如下圖

 

 

 代碼:

classdef DialogAppExample < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure                  matlab.ui.Figure
        SampleSizeEditFieldLabel  matlab.ui.control.Label
        EditField                 matlab.ui.control.NumericEditField
        ColormapDropDownLabel     matlab.ui.control.Label
        DropDown                  matlab.ui.control.DropDown
        Button                    matlab.ui.control.Button
    end


    properties (Access = private)
        CallingApp   % Main app object
    end


    % Callbacks that handle component events
    methods (Access = private)

        % Code that executes after component creation
        function StartupFcn(app, mainapp, sz, c)
            % Store main app in property for CloseRequestFcn to use
            app.CallingApp = mainapp;
            
            % Update UI with input values
            app.EditField.Value = sz;
            app.DropDown.Value = c;
        end

        % Button pushed function: Button
        function ButtonPushed(app, event)
            % Call main app's public function
            updateplot(app.CallingApp, app.EditField.Value, app.DropDown.Value);
            
            % Delete the dialog box
            delete(app)
        end

        % Close request function: UIFigure
        function DialogAppCloseRequest(app, event)
            % Enable the Plot Opions button in main app
            app.CallingApp.OptionsButton.Enable = 'on';
            
            % Delete the dialog box 
            delete(app)
            
        end
    end

    % Component initialization
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [600 100 392 248];
            app.UIFigure.Name = 'Options';
            app.UIFigure.CloseRequestFcn = createCallbackFcn(app, @DialogAppCloseRequest, true);

            % Create SampleSizeEditFieldLabel
            app.SampleSizeEditFieldLabel = uilabel(app.UIFigure);
            app.SampleSizeEditFieldLabel.HorizontalAlignment = 'right';
            app.SampleSizeEditFieldLabel.VerticalAlignment = 'top';
            app.SampleSizeEditFieldLabel.Position = [102 160 74 15];
            app.SampleSizeEditFieldLabel.Text = 'Sample Size';

            % Create EditField
            app.EditField = uieditfield(app.UIFigure, 'numeric');
            app.EditField.Limits = [2 1000];
            app.EditField.Position = [191 156 100 22];
            app.EditField.Value = 35;

            % Create ColormapDropDownLabel
            app.ColormapDropDownLabel = uilabel(app.UIFigure);
            app.ColormapDropDownLabel.HorizontalAlignment = 'right';
            app.ColormapDropDownLabel.VerticalAlignment = 'top';
            app.ColormapDropDownLabel.Position = [117 106 59 15];
            app.ColormapDropDownLabel.Text = 'Colormap';

            % Create DropDown
            app.DropDown = uidropdown(app.UIFigure);
            app.DropDown.Items = {'Parula', 'Jet', 'Winter', 'Cool'};
            app.DropDown.Position = [191 102 100 22];
            app.DropDown.Value = 'Parula';

            % Create Button
            app.Button = uibutton(app.UIFigure, 'push');
            app.Button.ButtonPushedFcn = createCallbackFcn(app, @ButtonPushed, true);
            app.Button.Position = [116 43 174 22];
            app.Button.Text = 'OK';

            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end

    % App creation and deletion
    methods (Access = public)

        % Construct app
        function app = DialogAppExample(varargin)

            % Create UIFigure and components
            createComponents(app)

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

            % Execute the startup function
            runStartupFcn(app, @(app)StartupFcn(app, varargin{:}))

            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

4.3  重點內容

4.3.1 將信息發送給對話框

執行以下步驟,將值從主 App 傳遞給對話框 App

(1)在對話框 App 中,為 StartupFcn 回調定義輸入參數,然后將代碼添加到回調中。

  打開對話框 App 的代碼視圖。在編輯器選項卡上,點擊 App 輸入參數。在 App 輸入參數對話框中,為您的輸入參數輸入以逗號分隔的變量名稱列表。將其中一個輸入指定為存儲主 App 對象的變量。然后點擊確定。

  將代碼添加到 StartupFcn 回調中,以存儲 mainapp 的值。

 

 

 

 

function StartupFcn(app,mainapp,sz,c)
    % Store main app object
    app.CallingApp = mainapp;

    % Process sz and c inputs
    ...
end

2.從主 App 的回調中調用對話框 App。打開主 App 的代碼視圖,然后為選項按鈕添加一個回調函數。此回調禁用選項按鈕,以防止用戶打開多個對話框。接下來,它獲取要傳遞給對話框的值,然后使用輸入參數和輸出參數調用對話框 App。輸出參數是對話框 App 對象。

function OptionsButtonPushed(app,event) 
    % Disable Plot Options button while dialog is open
    app.OptionsButton.Enable = 'off';

    % Get szvalue and cvalue
    % ....
    
    % Call dialog box with input values
    app.DialogApp = DialogAppExample(app,szvalue,cvalue);
end

3.在主 App 中定義一個屬性,以存儲對話框 App。在主 App 保持打開的情況下,創建一個名為 DialogApp 的私有屬性。在編輯器選項卡上選擇屬性 > 私有屬性。然后,將 properties 模塊中的屬性名稱更改為 DialogApp

properties (Access = private)
       DialogApp % Dialog box app
end

4.3.2 將信息返回給主App

執行以下步驟,將用戶的選擇返回給主 App

1.在主 App 中創建一個公共函數,以更新 UI。打開主 App 的代碼視圖,然后在編輯器選項卡上選擇函數 > 公共函數。

將默認函數名稱更改為所需的名稱,即你所希望從對話框傳遞給主 App 的每個選項添加輸入參數。app 參數必須是第一個,因此請在此參數后指定其他參數。然后將代碼添加到處理輸入並更新主 App 的函數中。

function updateplot(app,sz,c) 
    % Process sz and c 
    ...
end

2.在對話框 App 中創建一個屬性,以存儲主 App。打開對話框 App 的代碼視圖,然后創建一個名為 CallingApp 的私有屬性。在編輯器選項卡上選擇屬性> 私有屬性。然后,將 properties 模塊中的屬性名稱更改為 CallingApp

properties (Access = private)
        CallingApp % Main app object
end

3.從對話框 App 的回調中調用公共函數。在對話框 App 保持打開的情況下,為確定按鈕添加一個回調函數。

在此回調中,將 CallingApp 屬性和用戶的選擇傳遞給公共函數。然后調用 delete 函數以關閉對話框。

function ButtonPushed(app,event)
   % Call main app's public function
   updateplot(app.CallingApp,app.EditField.Value,app.DropDown.Value);

   % Delete the dialog box  
   delete(app)                  
end

4.3.3 關閉窗口時的管理任務

  兩個 App 都必須在用戶關閉它們時執行某些任務。在對話框關閉之前,它必須重新啟用主 App 中的選項按鈕。在主 App 關閉之前,它必須確保對話框 App 也關閉。

1.打開對話框 App 的代碼視圖,右鍵點擊組件瀏覽器中的 app.UIFigure 對象,然后選擇回調 > 添加 CloseRequestFcn 回調。然后添加重新啟用主 App 中的按鈕並關閉對話框 App 的代碼

function DialogAppCloseRequest(app,event)
   % Enable the Plot Options button in main app
   app.CallingApp.OptionsButton.Enable = 'on';
            
   % Delete the dialog box 
   delete(app)             
end

2.打開主 App 的代碼視圖,右鍵點擊組件瀏覽器中的 app.UIFigure 對象,然后選擇回調 > 添加 CloseRequestFcn 回調。然后添加刪除這兩個 App 的代碼。

function MainAppCloseRequest(app,event)
   % Delete both apps
   delete(app.DialogApp)
   delete(app)              
end

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Dialog


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM