Подтвердить что ты не робот

Оптимизированные вкладки в графическом интерфейсе MATLAB

Я работаю в графическом интерфейсе в MATLAB, и я использую вкладки для организации информации. Поскольку вкладки не поддерживаются в 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 s. Это не выглядит переполненным для меня. Кроме того, я сделал макет и обратные вызовы самостоятельно с минимальным количеством кода и накладными расходами. Но у него все еще есть очень раздражающие переходы tab.

4b9b3361

Ответ 1

Возможно, если вы поместите дескрипторы в массив. Таким образом, вам не нужно проходить через каждый из них. Это кажется мне быстрым, но "быстрый" может означать много вещей:)

Я удалил некоторые свойства, чтобы сделать пример короче...

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

Это поможет вам?

Ответ 2

Я настоятельно рекомендую, что если вы создаете GUI любой сложности, посмотрите GUI Layout Toolbox и не используйте GUIDE - он просто не подходит для целей при создании сложных графических интерфейсов (это не критика, а просто то, что он предназначен только для создания простых простых графических интерфейсов).

GUI Layout Toolbox значительно упрощает создание графических интерфейсов профессионального уровня и включает в себя функциональность для вкладок, а также многое другое, например, простое изменение размера и дополнительные виджеты.

Чтобы решить некоторые из проблем, возникших в комментариях к другим ответам. GUI Layout Toolbox не использует недокументированные/неподдерживаемые/скрытые функции MATLAB. Несмотря на то, что это не официальный продукт MathWorks, он разработан Ben Tordoff и David Sampson из консалтинговой группы MathWorks и свободно доступен по лицензии, что означает, что вам будет удобно использовать и включать в развернутый продукт.

В качестве примечания вы отметите в одном комментарии, что ваши вкладки содержат около 50 элементов управления. Интересно, может ли реальное решение изменить дизайн вашего графического интерфейса? Конечно, вы бы лучше знали, что подходит для вашего приложения, но 50 элементов управления, видимых пользователю сразу, похоже, что это может быть плохой идеей с точки зрения удобства использования, а также с представлением о трудностях для времени перерисовки графического интерфейса.

Ответ 3

Если вы можете использовать недокументированные функции, я предлагаю использовать uitab или tabdlg. См. этот пост на unocumentedmatlab.com.