您的问题的本质似乎是关于在 GUI 之间共享数据,因为您声明要“根据所选颜色显示一些其他结果”。
注意:MATLAB 文档注意事项: 请勿UserData
在您使用 App Designer 创建的 App 中使用属性。
该文档继续推荐在应用程序设计器应用程序之间共享数据和在应用程序设计器中创建多窗口应用程序的方法。
为了完整起见,我将提供一个与 MATLAB 文档不同的详细示例,说明如何完全在 App 设计器中完成此操作。
设置
我创建了 2 个应用程序设计器应用程序controlGUI.mlapp和plotGUI.mlapp。运行controlGUI()
一次加载两个 mlapp 文件,然后允许您从 controlGUI 中的回调控制 plotGUI 的各个方面。当然,plotGUI 可以做任何事情,但我让它改变了绘制数据的视觉方面。
细节
为简单起见,我将 controlGUI 设置为主应用程序。我可以通过在 controlGUI 中添加一个名为的属性PlotWindow
并让它包含调用的输出plotGUI()
;另一个mlapp。我还有一个回调函数,用于更新 plotGUI 中的 DATA 属性的三个下拉列表。此 DATA 属性附加了一个侦听器,该侦听器触发回调以更新uiaxes
对象。
plotGUI
魔法真的在这个物体上。也就是说,我创建了一个名为 DATA 的属性并更改了访问权限。通过设置属性 access SetObservable = true
,我们可以添加一个PostSet
事件监听器,我将它存储在一个私有属性dataChangedListener
中,在startupFcn
.
properties (Access = public, SetObservable=true)
DATA % A struct with xdata, ydata, fields. Other line prop fields ok
end
properties (Access = private)
dataChangedListener % listener object for when DATA is changed.
end
然后启动函数,startupFcn
用一些(任意)数据作为结构初始化 DATA 属性,然后添加并启用PostSet
侦听器。
% Code that executes after component creation
function startupFcn(app, data)
if nargin < 2
% create a default dataset
data = struct();
data.xdata = linspace(0,1,1001);
data.ydata = sin(data.xdata.*2*pi*10);%10hz signal
data.color = app.Axes.ColorOrder(1,:);
end
app.DATA = data;
% plot the data
line(data, 'parent', app.Axes);
% add and enable PostSet event listener for the DATA property
app.dataChangedListener = addlistener(...
app,'DATA','PostSet', ...
@(s,e) app.updatePlot ...
);
app.dataChangedListener.Enabled = true;
end
侦听器PostSet
调用方法app.updatePlot()
,所以我们必须将此方法添加到我们的应用程序中。每当修改中的任何内容时,app.DATA
都会调用此方法。因此,我创建了“函数”(正如代码浏览器所称),它只是删除axes
子项(现有行)并使用低级版本基于struct 对象line()
绘制原始线:app.DATA
function updatePlot(app)
%clear plot
delete(app.Axes.Children);
% draw the new plot
line(app.DATA, 'parent', app.Axes);
end
是的,line()
将接受具有与有效行属性相对应的字段名称的结构,但我似乎无法具体找到参考。但是,如果您阅读了有关inputParser 对象的信息……抱歉,题外话。
控制GUI
这个对象比较简单。它将 plotGUI 保存在一个属性中,允许直接访问 plotGUI 属性和公共方法。
properties (Access = public)
PlotWindow = plotGUI() % holds the reference to the plot window
end
我还在updatePlot
这里创建了一个回调方法,与 plotGUI 方法不同,我的命名不好。尽管如此,这种控制方法从 controlGUI 下拉列表中获取值,然后修改 plotGUIDATA
结构,存储在app.PlotWindow.DATA
. 因此,只要更改任何下拉列表(ValueChangedFcn
),就会调用这个回调。因此,结构的PostSet
侦听器DATA
将触发回调以相应地更新绘图。
% Value changed function: LineColor, LineStyle, MarkerStyle
function updatePlot(app, event)
mStyle= app.MarkerStyle.Value;
lStyle= app.LineStyle.Value;
lColor = app.LineColor.Value;
d = app.PlotWindow.DATA;
switch mStyle
case 'none'
d.marker = 'none';
case 'circle'
d.marker = 'o';
case 'diamond'
d.marker = 'diamond';
case 'point'
d.marker = '.';
end
switch lStyle
case 'none'
d.linestyle = 'none';
case 'solid'
d.linestyle = '-';
case 'dashed'
d.linestyle = '--';
case 'dotted'
d.linestyle = ':';
end
d.color = lColor;
% set the data back into the plotGUI
% The plotGUI's DATA PostSet listener will update the actual plot
app.PlotWindow.DATA = d;
end