我正在尝试@Amro建议我,我改变了部分代码并且出现了一些错误:/
请帮帮我。
我将选项设置为:
options = {
{'r','g','b','c','m','y','k'} ;
{'x','o','.','s'} ;
{'1','2','3'} ;
{'2','3'} ;
{'1','3'} ;
{'1','2'}
};
现在,我在matlab中写道:
mainGUI(options)
我收到了这些错误:
??? Index exceeds matrix dimensions.
Error in ==> tmp>secondaryGUI at 67
if strcmp(selected{i},options{i}{j})
Error in ==> tmp>callback at 17
hOptsGUI = secondaryGUI(hFig);
??? Error while evaluating uicontrol Callback
这是代码:
function mainGUI(options)
%# current options
opts = {'r', '.', '1'};
%# create main figure, with plot and options button
hFig = figure;
callback
%# options button callback function
function callback(o,e)
%# save current options (sharing data between the two GUIs)
setappdata(hFig, 'opts',opts);
%# display options dialog and wait for it
hOptsGUI = secondaryGUI(hFig, options);
waitfor(hOptsGUI);
%# get new options, and update plot accordingly
opts = getappdata(hFig, 'opts');
opts
end
end
function hFig = secondaryGUI(hParentFig, options)
%# create figure
hFig = figure('Menubar','none', 'Resize','off', ...
'WindowStyle','modal', 'Position',[100 100 350 200]);
movegui(hFig, 'center');
%# all possible plot options
options = cellfun(@(c) c(end:-1:1), options, 'Uniform',false);
num = length(options);
%# get saved settings
selected = getappdata(hParentFig, 'opts');
%# top/bottom panels
hPanBot = uipanel('Parent',hFig, 'BorderType','none', ...
'Units','normalized', 'Position',[0 0.0 1 0.2]);
hPanTop = uipanel('Parent',hFig, 'BorderType','none', ...
'Units','normalized', 'Position',[0 0.2 1 0.8]);
%# buttongroups in top panel
hBtnGrp = zeros(1,num);
width = 1/num;
for i=1:num
%# create button group
hBtnGrp(i) = uibuttongroup('Parent',hPanTop, ...
'Units','normalized', 'Position',[(i-1)*width 0 width 1]);
%# populate it with radio buttons
height = 1./numel(options{i});
for j=1:numel(options{i})
h = uicontrol('Parent',hBtnGrp(i), 'Style','Radio', ...
'Units','normalized', 'Position',[0.05 (j-1)*height 0.9 height], ...
'String',options{i}{j});
%# set initially selected values
if strcmp(selected{i},options{i}{j})
set(hBtnGrp(i), 'SelectedObject',h)
end
end
end
%# save button in bottom panel
uicontrol('Parent',hPanBot, 'Style','pushbutton', ...
'Units','normalized', 'Position',[0.3 0.2 0.4 0.6], ...
'String','start', 'Callback',@callback)
%# save button callback function
function callback(o,e)
%# get selected values
hObjs = get(hBtnGrp(:), 'SelectedObject');
vals = get(cell2mat(hObjs),{'String'});
%# update settings
setappdata(hParentFig, 'opts',vals);
%# close options dialog
close(hFig)
end
end
可能变量'opts'存在问题,因为没有以下值:{'r','。','1'}?
因为我不知道为什么它超出矩阵尺寸,选项的长度是6。
谢谢你!答案 0 :(得分:1)
如果我理解正确,您正在设计一个GUI,使用户可以设置一些参数并返回所选的选项。
您可以使用GETAPPDATA / SETAPPDATA作为数据共享机制,而不是像现在一样立即返回值。
对于布局,使用panels将组件组合在一起,这样可以实现更灵活的GUI。
这是一个示例应用程序来说明。我们的想法是我们有一个包含绘图的主图,我们提供了第二个“对话框”来自定义绘图选项。
function mainGUI()
%# current options
opts = {'r', '.', '1'};
%# create main figure, with plot and options button
hFig = figure;
hLine = plot(cumsum(rand(100,1)-0.5), ...
'Color',opts{1}, 'Marker',opts{2}, 'LineWidth',str2double(opts{3}));
uicontrol('Style','pushbutton', 'String','Options...', 'Callback',@callback)
%# options button callback function
function callback(o,e)
%# save current options (sharing data between the two GUIs)
setappdata(hFig, 'opts',opts);
%# display options dialog and wait for it
hOptsGUI = secondaryGUI(hFig);
waitfor(hOptsGUI);
%# get new options, and update plot accordingly
opts = getappdata(hFig, 'opts');
set(hLine, 'Color',opts{1}, 'Marker',opts{2}, 'LineWidth',str2double(opts{3}))
end
end
function hFig = secondaryGUI(hParentFig)
%# create figure
hFig = figure('Menubar','none', 'Resize','off', ...
'WindowStyle','modal', 'Position',[100 100 350 200]);
movegui(hFig, 'center');
%# all possible plot options
options = {
{'r','g','b','c','m','y','k'} ; %# color
{'x','o','.','s'} ; %# shape
{'1','2','3'} %# width
};
options = cellfun(@(c) c(end:-1:1), options, 'Uniform',false);
num = length(options);
%# get saved settings
selected = getappdata(hParentFig, 'opts');
%# top/bottom panels
hPanBot = uipanel('Parent',hFig, 'BorderType','none', ...
'Units','normalized', 'Position',[0 0.0 1 0.2]);
hPanTop = uipanel('Parent',hFig, 'BorderType','none', ...
'Units','normalized', 'Position',[0 0.2 1 0.8]);
%# buttongroups in top panel
hBtnGrp = zeros(1,num);
width = 1/num;
for i=1:num
%# create button group
hBtnGrp(i) = uibuttongroup('Parent',hPanTop, ...
'Units','normalized', 'Position',[(i-1)*width 0 width 1]);
%# populate it with radio buttons
height = 1./numel(options{i});
for j=1:numel(options{i})
h = uicontrol('Parent',hBtnGrp(i), 'Style','Radio', ...
'Units','normalized', 'Position',[0.05 (j-1)*height 0.9 height], ...
'String',options{i}{j});
%# set initially selected values
if strcmp(selected{i},options{i}{j})
set(hBtnGrp(i), 'SelectedObject',h)
end
end
end
%# save button in bottom panel
uicontrol('Parent',hPanBot, 'Style','pushbutton', ...
'Units','normalized', 'Position',[0.3 0.2 0.4 0.6], ...
'String','Save & Close', 'Callback',@callback)
%# save button callback function
function callback(o,e)
%# get selected values
hObjs = get(hBtnGrp(:), 'SelectedObject');
vals = get(cell2mat(hObjs),{'String'});
%# update settings
setappdata(hParentFig, 'opts',vals);
%# close options dialog
close(hFig)
end
end