我在MATLAB的GUI中工作,我使用选项卡来组织信息。由于MATLAB GUIDE不支持选项卡,我只需创建几个uipanel
并更改其'Visible'
字段。但是,当每个面板中的控件数量很大时,在面板之间切换需要一些时间。有没有人知道如何更快地切换标签?
我提供了一个基于标签的界面的简单示例。
tab_example_gui.m
% Figure
handles.figure_window = figure(...
'Units','characters',...
'Tag','figure_window',...
'Position',[50 50 80 25],...
'Name','Tab Example',...
'DockControls','off',...
'IntegerHandle','off',...
'MenuBar','none',...
'NumberTitle','off',...
'Resize','off');
% Buttons
handles.tab_panel = uibuttongroup(...
'Parent',handles.figure_window,...
'Tag','tab_panel',...
'Units','characters',...
'Position',[0 23 80 2],...
'SelectionChangeFcn',@(hObject,eventdata)tab_example_callback(hObject,eventdata,guidata(hObject)),...
'BorderType','none');
handles.tab_a = uicontrol(...
'Parent',handles.tab_panel,...
'Tag','tab_a',...
'Units','characters',...
'Position',[0 0 40 2],...
'Style','togglebutton',...
'String','Tab A');
handles.tab_b = uicontrol(...
'Parent',handles.tab_panel,...
'Tag','tab_b',...
'Units','characters',...
'Position',[40 0 40 2],...
'Style','togglebutton',...
'String','Tab B');
% Panel A
handles.panel_a = uipanel(...
'Parent',handles.figure_window,...
'Tag','panel_menu',...
'Units','characters',...
'Position',[0.1 0 79.8 23],...
'Visible','On');
handles.panel_a_text = uicontrol(...
'Parent',handles.panel_a,...
'Tag','panel_menu_load_id_text',...
'Units','characters',...
'Position',[0 0 77 22],...
'Style','text',...
'String','This is the tab A');
% Panel B
handles.panel_b = uipanel(...
'Parent',handles.figure_window,...
'Tag','panel_menu',...
'Units','characters',...
'Position',[0.1 0 79.8 23],...
'Visible','Off');
handles.panel_b_text = uicontrol(...
'Parent',handles.panel_b,...
'Tag','panel_menu_load_id_text',...
'Units','characters',...
'Position',[0 0 77 22],...
'Style','text',...
'String','This is the tab B');
guidata(handles.figure_window, handles);
tab_example_callback.m
function tab_example_callback(hObject,eventdata,handles)
switch get(get(hObject,'SelectedObject'),'Tag')
case 'tab_a', set(handles.panel_a,'Visible','On'); set(handles.panel_b,'Visible','Off');
case 'tab_b', set(handles.panel_a,'Visible','Off'); set(handles.panel_b,'Visible','On');
end
guidata(handles.figure_window, handles);
end
注意:GUI将在5个选项卡中引入模拟参数。在每个标签中,我有大约15行;每行有一个text
,一个checkbox
和三个edit
。它对我来说看起来并不过分拥挤。此外,我使用最少量的代码和开销自行完成布局和回调。但是,它仍然有非常恼人的标签转换。
答案 0 :(得分:3)
也许你把句柄放在一个数组中。这样你就不必经历每一个。这对我来说似乎很快,但“快速”可能意味着很多事情:)
我删除了一些属性以缩短示例...
function test(N) % N is the number of tabs
if nargin == 0
N = 3;
end
% Figure
handles.figure_window = figure(...
'Units','characters',...
'Position',[50 50 80 25]);
% Buttons
handles.tab_panel = uibuttongroup(...
'Parent',handles.figure_window,...
'Units','characters',...
'Position',[0 23 80 2]);
alpha = 'ABCDEFGHIJKLMNOPQRSTUVXYZ';
for i_tab=1:N
% button
handles.tabs(i_tab) = uicontrol(...
'Parent',handles.tab_panel,...
'Units','characters',...
'Position',[80/N*(i_tab-1) 0 80/N 2],...
'Style','togglebutton',...
'String',['Tab ' alpha(i_tab)]);
% Panel i
handles.panels(i_tab) = uipanel(...
'Parent',handles.figure_window,...
'Units','characters',...
'Position',[0.1 0 79.8 23],...
'Visible','Off');
handles.panel_a_text = uicontrol(...
'Parent',handles.panels(i_tab),...
'Units','characters',...
'Position',[0 0 77 22],...
'Style','text',...
'String',['This is the tab ', alpha(i_tab)]);
end
% set callback for all buttons
set(handles.tabs, 'callback', {@tab_example_callback handles})
% choose tab 1 as active
set(handles.panels(1), 'Visible','On');
guidata(handles.figure_window, handles);
function tab_example_callback(hObject,eventdata,handles)
% set everything invisible
set(handles.panels,'Visible','Off');
% turn on selected panel
set(handles.panels(handles.tabs == hObject), 'Visible','On');
guidata(handles.figure_window, handles);
这对你有帮助吗?
答案 1 :(得分:2)
我强烈建议,如果您要创建任何复杂性的GUI,请查看GUI Layout Toolbox,并且不要使用GUIDE - 在创建复杂的GUI时它不适合用途(这不是批评,它仅仅是为了制作快速,简单的GUI而设计的。
GUI Layout Toolbox使创建专业标准GUI变得非常容易,并且包含选项卡的功能,以及其他许多功能,例如轻松调整大小和其他小部件。
解决您在评论中提出的其他问题的一些问题。 GUI Layout Toolbox不使用MATLAB的未记录/不支持/隐藏功能。虽然它不是MathWorks的官方产品,但它是由MathWorks咨询集团的Ben Tordoff和David Sampson开发的,并且可以在许可下免费获得,这意味着您可以使用并包含在已部署的产品中。
作为旁注,您在一条评论中提到您的标签每个都包含大约50个控件。我想知道真正的解决方案是否可能会重新设计你的GUI?当然,你会比我知道什么更适合你的应用程序,但是从用户可见的50个控件似乎从可用性的角度来看可能是一个坏主意,并且为GUI重绘时间带来了困难。
答案 2 :(得分:1)
如果您可以免费使用未记录的功能,建议您使用uitab
或tabdlg
。请参阅this post on undocumentedmatlab.com。