当前位置: 首页 > news >正文

matlab的app中传递数据

真没有想到这个问题还困惑我好几天。

方法很多,有2种有效的方法

1 方法1 回调函数

主窗口定义一个数据接收方法,然后将该方法作为回调函数传递给子窗口。当子窗口中的按钮被点击时,调用这个回调函数并传递数据。

1.1 主窗口需要对下面变量申明

ZeroCorrectionApp % 子窗口实例ReceivedData % 接收到的数据

如果还要传递函数到子窗口,则需要子窗口提供一个public函数(setMainData, public)在主窗口调用。

          % 传递数据到子窗口
app.ZeroCorrectionApp.setMainData(app.TempIDA);

classdef appmain < matlab.apps.AppBase% 主窗口应用程序properties (Access = public)% 主窗口UI组件UIFigure matlab.ui.FigureOpenSubAppButton matlab.ui.control.ButtonDataTable matlab.ui.control.Tableendproperties (Access = private)ZeroCorrectionApp % 子窗口实例ReceivedData % 接收到的数据endmethods (Access = private)% 打开子窗口按钮回调function openSubAppButtonPushed(app, event)% 创建子窗口实例app.ZeroCorrectionApp = ZeroCorrectionApp();% 设置数据回调函数app.ZeroCorrectionApp.setDataCallback(@app.handleDataFromSubApp);% 显示子窗口app.ZeroCorrectionApp.UIFigure.Visible = 'on';end% 处理从子窗口接收的数据function handleDataFromSubApp(app, data)% 存储接收到的数据app.ReceivedData = data;% 更新主窗口的表格显示app.DataTable.Data = data;% 可以添加其他数据处理逻辑disp('数据已成功从子窗口传递到主窗口');disp(size(data));endend
end

1.2 子窗口

这里需要说明的是

app.DataCallback(app.DataTable.Data);就是传递参数过去,具体原理我也不清楚。只能说很神奇!!因为根本看不见调用 setDataCallback函数。

这种神奇的方法,到底是谁设计的???之前直接更换为setDataCallback,一直不成功。

classdef ZeroCorrectionApp < matlab.apps.AppBase% 子窗口应用程序properties (Access = public)% 子窗口UI组件UIFigure matlab.ui.FigureDataTable matlab.ui.control.TableSendDataButton matlab.ui.control.Buttonendproperties (Access = private)DataCallback % 数据回调函数T % 表格数据endmethods% 设置数据回调函数function setDataCallback(obj, callback)obj.DataCallback = callback;endendmethods (Access = private)% 创建组件function createComponents(app)% 创建UIFigureapp.UIFigure = uifigure('Visible', 'off');app.UIFigure.Position = [100 100 450 350];app.UIFigure.Name = '零校正应用';% 创建表格app.DataTable = uitable(app.UIFigure);app.DataTable.Position = [30 100 390 200];% 初始化示例数据app.T = array2table(rand(5, 3), 'VariableNames', {'A', 'B', 'C'});app.DataTable.Data = app.T;% 创建发送数据按钮app.SendDataButton = uibutton(app.UIFigure, 'push');app.SendDataButton.ButtonPushedFcn = createCallbackFcn(app, @sendDataButtonPushed, true);app.SendDataButton.Position = [170 50 100 30];app.SendDataButton.Text = '发送数据';% 显示UIFigureapp.UIFigure.Visible = 'on';end% 发送数据按钮回调function sendDataButtonPushed(app, event)% 确保回调函数已设置if ~isempty(app.DataCallback)% 调用回调函数,传递当前表格数据app.DataCallback(app.DataTable.Data);% 可选:关闭子窗口% delete(app.UIFigure);elseerrordlg('未设置数据回调函数', '错误');endendend
end

主窗口 appmain

│ 创建子窗口并设置回调

子窗口 ZeroCorrectionApp

│ 存储回调函数: app.DataCallback = @app.handleDataFromSubApp

│ 用户点击发送按钮

调用: app.DataCallback(表格数据)

│ 实际执行: app.handleDataFromSubApp(表格数据)

回到主窗口的 handleDataFromSubApp 方法处理数据

2 方法2 将app传递到子函数和主函数,方便使用

  • 主窗口 AppMain:生成一个子窗口,同时把数据 IDA 传给它。

  • 子窗口 ZeroCorrectionAPP:接收 IDA,做零点校正后得到 T,再把 T 回传给主窗口。

主窗口 AppMain.mlapp在 Properties 区域添加:propertiesZeroCorrectionApp   % 子窗口句柄IDA                 % 要传给子窗口的数据T                   % 接收子窗口传回来的结果
end在打开子窗口的按钮回调里:% Button pushed function: OpenChildButton
function OpenChildButtonPushed(app, event)% 例子:主窗口准备一个数据 IDAapp.IDA = randn(1,100);  % 打开子窗口,并把自己(app)和数据IDA传进去app.ZeroCorrectionApp = ZeroCorrectionAPP(app, app.IDA);
end再写一个主窗口的接收函数(供子窗口回调):function updateFromChild(app, T)app.T = T;   % 存储结果% 可以更新 UI,比如显示在一个编辑框里app.ResultEditField.Value = num2str(T);
end

🔹 子窗口 ZeroCorrectionAPP.mlapp在 Properties 区域添加:propertiesParentApp    % 主窗口句柄IDA          % 从主窗口传来的数据
end在构造函数里(App Designer 的 StartupFcn 里实现):% Code that executes after component creation
function startupFcn(app, parentApp, IDA)app.ParentApp = parentApp;  % 保存主窗口句柄app.IDA = IDA;              % 保存传来的数据% 例如显示数据大小app.Label.Text = sprintf("已接收到 IDA 大小:%d", length(IDA));
end

🔹 调用关系

  1. 主窗口点击按钮 → 打开 ZeroCorrectionAPP(app, IDA)

  2. 子窗口 startupFcn 接收 IDA 并保存。

  3. 子窗口操作后点击确认 → 计算 T → 调用 ParentApp.updateFromChild(T)

  4. 主窗口更新自身属性 T 并刷新 UI。

而传送数据到主窗口,还是要回调函数Callback

http://www.dtcms.com/a/354337.html

相关文章:

  • 林墨2025全新个人EP《嘻嘻呵呵嘿嘿哈哈》 第三支单曲解锁
  • 【数据分享】安徽省安庆市地理基础数据(道路、水系、铁路、行政边界(含乡镇)、DEM等)
  • 企业分支上云的常见误区与纠正方案
  • LeetCode - 反转链表 / K 个一组翻转链表
  • HSA35NV001美光固态闪存NQ482NQ470
  • CT03-215.数组中第k大的元素
  • 面试之微服务架构
  • 美团面试手撕:手动实现开方函数math.sqrt(x)
  • Spring Security 深度学习(一): 基础入门与默认行为分析
  • 【Vue2 ✨】Vue2 入门之旅(一):初识 Vue2
  • 详细梳理 MyBatis-Plus 的 QueryWrapper 和 LambdaQueryWrapper的入门到精通
  • App中分发中的防盗链开发是做什么的?防盗链有什么作用?什么是防盗链?
  • vscode 如何调试 python 2.7
  • 【PyTorch】基于YOLO的多目标检测项目(一)
  • 免费开源图片压缩工具|绿色版本地运行,支持批量压缩+格式转换,不上传数据,隐私安全有保障!
  • 解决delphi label 在timer下闪烁的问题
  • 字节面试手撕题:神经网络模型损失函数与梯度推导
  • CSS(面试)
  • Mojomox-在线 AI logo 设计工具
  • 从“流量焦虑”到“稳定增长”:用内容平衡术解锁Adsense变现新密码
  • 电子器械如何统一管理系统权限?一场IT治理的“攻坚战”
  • 第二十九天:重载、重写和覆盖
  • 【网络】iptables MASQUERADE作用
  • 机器学习与Backtrader结合量化交易
  • 无人机抗干扰技术要点解析
  • O2OA移动办公 × Flutter:一次开发,跨平台交付
  • 【C++】深入解析构造函数初始化
  • Docker 镜像重命名【打上新的标签】
  • AI应用图文解说--百度智能云实现语音聊天
  • Python爬虫获取1688商品列表与图片信息