以下均为自己的学习总结,有不对的地方,或者有更便捷的方法欢迎指正。
关于这部分的官方文档如下:

https://ww2.mathworks.cn/help/matlab/creating_guis/multiwindow-app-gui-in-app-designer.html

前言

多窗口之间的交互可大致分为两种
(1)不对主App进行改变
这一类简单来说就是不对主app进行任何改变,其功能只有打开一个新的窗口。应用场景比如平时经常遇到的登录界面,点击登录进入另一个窗口。
(2)对主App中进行某种改变
相反,这一类是通过一个或多个新的窗口,来对主app中进行某种改变。
改变也可以分为两类
1)无数据传递。比如删除等操作行为的确认对话框,点击确认则删除指定行的数据。不需要在另一个app中输入参数,传回主App。
2)有数据传递。比如为为主app中的表添加一行数据,这一行数据通过一个新的窗口进行输入。

1 不对主App进行改变

这一类很简单,以登录界面为例,只要在登录按钮的回调函数中,编写运行另一个窗口app的代码即可。
比如登录界面如下:

主程序app所保存的名称为 mainApp.mlapp
在登录窗口中编写登录按钮回调函数

此时通过点击登录按钮可以打开主界面程序,但是登录界面仍然存在。我们需要的效果是点击完登录后,登录界面消失,主界面弹出。因此在运行另一个窗口前,删除登录界面。

2 对主App中进行某种改变

2.1 无数据传递,返回一个行为

比如在对主程序中的数据进行删除时,弹出确认删除对话框。如确认则删除,取消则不删除。
举个栗子,要删除UITable中的某一行(如何实现见这篇文章),但在按下“Delete”键后,需要向用户确认是否删除。点击确认删除,否则不进行提醒窗口消失,不进行任何操作。

(1)创建提醒对话框App,此处另存为 DeleteApp.mlapp
(2)在对话框App中添加属性,存储主程序对象

(3)在对话框App中编写startupFcn函数

 function startupFcn(app, mainapp)app.CallingApp = mainapp;end

(4)在对话框App中编写回调函数
因为我们想要在按下确认键后,执行删除的操作,因此在YesButtonPushed回调中编写。
而删除的操作,需要一个函数来执行(这里命名为DeleteTheData),使得主app中的一行为空。同时,在执行完后,使对话框app消失。

        function YesButtonPushed(app, event)DeleteTheData(app.CallingApp);delete(app);end

(5)在主App中编写DeleteTheData函数
因为需要在对话框app中调用,因此需要编写公共函数(即在app内部和外部都可以调用)

        function DeleteTheData(app)app.UITable_Quota.Data(app.mouse_ind,:)=[];   % 令鼠标选中行为空end

(6)在主App中编写Detele按钮的回调函数
我这里因为需要删除选中行,因此首先对鼠标是否有选中行进行了判断。如果有选中含的id不为空,则调用对话框App。否则提示用户选择一行数据。

            if ~isempty(app.mouse_ind)DeleteApp(app);                elsehs = msgbox(' Please select one row','message','warn');ht = findobj(hs,'Type','text');set(ht,'Fontsize',10,'Unit','normal');app.AddButton_Quota.Enable = 'on';end

2.2 多窗口间的数据传递

这是最复杂的一类情况。
比如现在主App中有一个表,需要实现每次添加一行的功能

设计弹出窗口如图,另存为命名 AddApp.mlapp

接下来开始进行数据的传递。

(1) 在对话框app中编写startupFcn函数

输入要传递的参数

定义私有属性,并将代码添加到 startupFcn 回调中,以存储 mainapp 的值。

(2)在对话框app中编写回调函数

我们想要在这个对话框中输入数据,并通过点击“确认”,使得主App中的表格增加所输入的数据。因此,我们可以想到需要编写一个更新数据的函数。
而这个函数需要输入的数据,则是在对话框app中输入的数据。因此,该函数的输入参数如代码。
同时,与前文同理,在确认后对话框应该消失,所以delete。

function Button_okPushed(app, event)updateData(app.CallingApp, app.EditField_name.Value, app.EditField_gender.Value,app.EditField_age.Value,app.EditField_score.Value)     % 更新主App中的数据delete(app)
end

此时这个updateData()函数是我们需要的,但还没有编写。因此,下一步我们需要在主App中编写这个函数。

(3)在主App中添加执行行为的函数

因为需要在对话框app中调用该函数,所以显然应该编写公共函数。
同时,在主App中,我们需要一些值,来接收对话框app中传入的值。
因此,在主App中添加属性,一部分是传递的参数,一部分是定义一个属性以存储对话框 App。需要注意的是,需要给变量赋一个初始值,否则后面会报错。

用定义的这些变量,来接收对话框app中输入的值。

 function updateData(app,name,gender,age,score)app.namevalue = name;app.gendervalue = gender;app.agevalue = age;app.scorevalue = score;new_data  = {name gender age score};new_data = cell2table(new_data);new_data.Properties.VariableNames = app.UITable.Data.Properties.VariableNames;app.UITable.Data = [app.UITable.Data;new_data];
(4)从主 App 的回调中调用对话框 App

因为要在按下按钮时调用,所以在“增加”按钮的回调函数中编写调用

完成效果

删除功能同理。

[MATLAB App Designer] 多窗口 App 中的交互(含数据传递)相关推荐

  1. 用matlab做app,2020-02-27 MATLAB App Designer——在用 App 设计工具创建的 App 内共享数据...

    1 访问和更新回调中的 UI 组件内的数据 app.Component.Property 2 获取并设置一个仪表的 Value 属性 x = app.PressureGauge.Value; % Ge ...

  2. Android中Activity之间的数据传递(Intent和Bundle)

    当一个Activity启动另一个Activity时,常常会有一些数据传过去,对于Activity之间的数据交换更简单,因为两个Activity之间进行数据传递交换更简单,因为两个Activity之间本 ...

  3. 三个activity之间跳转 数据传递_第二百四十二回:Android中Fragment之间的数据传递概述...

    各位看官们大家好,上一回中咱们说的是Android中Activity之间数据传递的例子,这一回咱们说的例子是Fragment之间的数据传递.闲话休提,言归正转.让我们一起Talk Android吧! ...

  4. ANDROID中ACTIVITY间的数据传递

    效果:有两个Activity分别为A和B,从A中采用Bundle封装数据向B中传递数据,然后使用startActivityForResult在B中修改后回传数据. 第一个Activity的layout ...

  5. java中怎么使用json数据_JAVA中使用JSON进行数据传递

    1.是不是只有xml传递数据的技术才是webservice? 可以这么理解.webservice是基于SOAP协议,SOAP协议是基于XML的文本协议.所以webservice可以简单理解为是基于XM ...

  6. Matlab GUI 设计(4):不同控件之间的数据传递

    GUI 中,不同GUI 之间的数据共享有四种方法:GUI 数据.Application数据.UserData数据.global数据.global 比较简单,主要学习前三种方法. GUI 数据:hand ...

  7. gzip android,怎么在Android系统中使用gzip进行数据传递

    Intent(意图)主要是解决Android应用的各项组件之间的通讯.为了实现传递数据这个目的需要以下步骤 Activity1需要构造一个 Intent,这个Intent用于告诉系统,我们要做&quo ...

  8. Vue2.x中的父组件数据传递至子组件

    父组件结构 template <template><div><v-girl-group :girls="aGirls"></v-girl- ...

  9. vue父组件变量传递子组件_Vue2.x中的父组件数据传递至子组件

    父组件结构 template :girls="aGirls"> script import vGirlGroup from './GirlGroup' export defa ...

最新文章

  1. 【Linux_Fedora_应用系列】_3_如何利用Smplayer播放WMV格式的文件
  2. Android-源代码分析
  3. 《Go 语言编程之旅》送煎架和站长写的书
  4. Spring JDBC的学习
  5. git rebase原理(转)
  6. java perl5compiler_用java取得電腦IP﹑電腦名稱以及網卡地址的方法
  7. linux安装nvidia黑屏,GTX 550 Ti 安装Linux遇到的问题 黑屏 显示器休眠
  8. 由前序遍历和中序遍历确定二叉树
  9. 12位黄金技术大佬发出警告:一大波必读好书向你袭来
  10. zen3 服务器芯片,AMD EPYC霄龙服务器处理器亮相,Zen3架构性能飙升
  11. STEP 7-Micro/WIN SMART 界面介绍
  12. Unity3d 无人机
  13. android高德地图热力图,热力图-自有数据图层-示例中心-JS API 示例 | 高德地图API...
  14. 易辅客栈第六套零基础开发商业脚本_网页游戏篇
  15. 5064. 友好城市
  16. 怎么用计算机测试手速,魔兽争霸apm测试器-请问怎样测试自己的手速?(APM)需要专门 – 手机爱问...
  17. Hexo博客搭建教程
  18. 【C++---16】常指针和常引用
  19. 2020手机CPU性能天梯图
  20. 小游戏系列算法之五广度优先搜索,双向广搜,八数码,华容道

热门文章

  1. 程序员如何避免「温水煮码农」
  2. 史玉柱正式退休:把互联网留给年轻人
  3. 相对定位 绝对定位 固定定位 粘性定位 居中的三种方法 calc函数标签的使用方法
  4. 话说无为原理——数据分析漫谈6
  5. “你打篮球像蔡徐坤”:微信翻译这个bug是怎么回事?
  6. android createbitmap设置背景色,Android createBitmap截取实现移动的游戏背景
  7. 2021-2027全球与中国翠绿宝石激光器市场现状及未来发展趋势
  8. MacBook更换开机登录界面壁纸
  9. mac 开机启动php,macbook开机启动nginx和php
  10. mysql什么方法返回id_MYSQL获取自增ID的四种方法