admin管理员组文章数量:1559090
以下均为自己的学习总结,有不对的地方,或者有更便捷的方法欢迎指正。
关于这部分的官方文档如下:
https://ww2.mathworks/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);
else
hs = 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 中的交互(含数据传递) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1727372095a1111300.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论