首页 > 解决方案 > 如何在应用程序(mlapp)上实现模态弹出窗口?

问题描述

我想创建一个模态弹出窗口,其中包含许多 uiedit、uimenu 和 uipushbutton 控件。此模式弹出窗口应出现在 MATLAB 应用程序的顶部(使用应用程序设计器构建;而不是使用 GUIDE)。当模式弹出窗口处于活动状态时,父应用程序 UIFigure 应该是灰色的,类似于打开uiconfirm对话框时发生的情况。是否有未记录的方式或其他解决方法来实现这种类型的 UI 元素?

这个想法是,用户单击主应用程序上的“设置”按钮,弹出模式对话框,同时停用主应用程序控件,以允许调整设置。

标签: matlab-app-designer

解决方案


查看uiwait的文档,它准确地解释了如何达到您想要的效果。

为了遵循提供有意义答案的最佳实践,我可能会按如下方式处理这个问题。

为“设置”按钮创建回调:

  • 通过将其属性设置为“变灰”所需的应用程序的 UI 元素Enable'off'
  • 实例化您为设置 UI 创建的 *.mlapp

从这里开始,有很多可能性。一种方法是uiwait设置 mlapp 的UIFigure,因为默认情况下,它包含在 mlapp 定义的公共属性中。如果您想等到设置 UI 关闭,您可以简单地使用uiwait(settingsApp.UIFigure);. 关闭设置 UI 后,您可以重新启用所有主要应用程序组件以取消“灰色”它们。

例如,您的“设置按钮”回调可能如下所示:

function onRequestSettings(app, event)
  % set main figure's UI elements gray
  % Assuming you want all elements gray
  set(app.UIFigure.Children, 'Enable', 'off');

  % create the settings UI by instantiating it here
  settingsApp = settingsUI();

  % wait until the figure closes
  uiwait(settingsApp.UIFigure);

  % ... SEE NOTE BELOW CODE BLOCK! ... %

  % Now that the settings UI is closed,
  % set main figure's UI elements back to normal.
  % Again, assuming all elements here
  set(app.UIFigure.Children, 'Enable', 'on');
end

笔记:

虽然上面的代码块会产生你想要的行为,但我没有展示如何在设置应用程序和主应用程序之间共享数据。我假设,因为你没有明确要求这个,你有一些想法。如果没有,我将向您指出在应用程序设计器中创建多窗口应用程序共享数据的文档以及此答案handle或者,您可以利用 mlapps 是超类成员的事实,因此具有内置事件ObjectBeingDestroyed. 您可以为此事件构造一个侦听器(请参阅addlistenerthis)并将其绑定到主应用程序中的方法,然后根据设置应用程序上所做的更改更新主应用程序。

或者:

如果 settingsUI 存储在主应用程序的属性中,例如app.settingsUI,并且被主应用程序实例化,但可能隐藏,startupFcn那么每次按下“设置按钮”时都不需要重新实例化,您可以简单地将其向前推进figure(app.settingsUI.UIFigure);. 然后将其设为“模态”uiwait(app.settingsUI.UIFigure);并覆盖 settingsUIcloseRequestFcn以释放代码执行暂停uiresume。关闭回调可能如下所示:

classdef settingsUI < matlab.apps.AppBase

...

  function UIFigureCloseRequest(app,event)
    % override close request to prevent deleting the app
    % hide the settings window to appear as though it was closed
    app.UIFigure.Visible = 'off';

    % resume code execution so that main app can continue to run.
    uiresume(app.UIFigure);
  end

...

end

-干杯


推荐阅读