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
🔹 调用关系
主窗口点击按钮 → 打开
ZeroCorrectionAPP(app, IDA)
。子窗口
startupFcn
接收IDA
并保存。子窗口操作后点击确认 → 计算
T
→ 调用ParentApp.updateFromChild(T)
。主窗口更新自身属性
T
并刷新 UI。
而传送数据到主窗口,还是要回调函数Callback