14

我在 MATLAB 的 GUI 中工作,我使用选项卡来组织信息。由于 MATLAB GUIDE 不支持这些选项卡,我只创建了几个uipanels 并更改它们的'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和三个edits。对我来说,它看起来并不拥挤。此外,我用最少的代码和开销自行完成了布局和回调。但是,它仍然有非常烦人的标签转换。

4

3 回答 3

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);

这对你有帮助吗?

于 2013-03-15T12:35:55.457 回答
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 重绘时间带来困难。

于 2014-03-12T17:40:26.793 回答
1

如果您可以随意使用未记录的功能,我建议使用uitabor tabdlg。请参阅undocumentedmatlab.com 上的这篇文章

于 2013-03-15T13:32:47.043 回答